1
0

__init__.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import tkinter as tk
  2. from tkinter import filedialog
  3. class DragWindow(tk.Tk):
  4. root_x, root_y, abs_x, abs_y = 0, 0, 0, 0
  5. width, height = None, None
  6. def __init__(self, alpha=0.97, width=None, height=None):
  7. super().__init__()
  8. self.width, self.height = width, height
  9. self.wm_attributes("-alpha", alpha) # 透明度
  10. self.bind("<B1-Motion>", self._on_move)
  11. self.bind("<ButtonPress-1>", self._on_tap)
  12. def set_display_postion(self, offset_x, offset_y):
  13. self.geometry("+%s+%s" % (offset_x, offset_y))
  14. def set_window_size(self, w, h):
  15. self.width, self.height = w, h
  16. self.geometry("%sx%s" % (w, h))
  17. def _on_move(self, event):
  18. offset_x = event.x_root - self.root_x
  19. offset_y = event.y_root - self.root_y
  20. if self.width and self.height:
  21. geo_str = "%sx%s+%s+%s" % (
  22. self.width,
  23. self.height,
  24. self.abs_x + offset_x,
  25. self.abs_y + offset_y,
  26. )
  27. else:
  28. geo_str = "+%s+%s" % (self.abs_x + offset_x, self.abs_y + offset_y)
  29. self.geometry(geo_str)
  30. def _on_tap(self, event):
  31. self.root_x, self.root_y = event.x_root, event.y_root
  32. self.abs_x, self.abs_y = self.winfo_x(), self.winfo_y()
  33. # 重建文件读取类 askdirectory,askopenfilename,askopenfilenames,asksaveasfilename
  34. askopenfilenames = filedialog.askopenfilenames
  35. def askopenfilename(title, must=False, **parameters):
  36. while True:
  37. name = filedialog.askopenfilename(title=title, **parameters)
  38. if name == '':
  39. if not must:
  40. raise NameError
  41. continue
  42. break
  43. return name
  44. def asksaveasfilename(title, **parameters):
  45. name: str = filedialog.asksaveasfilename(title=title, **parameters)
  46. if name == '':
  47. raise NameError
  48. end = parameters.get('filetypes', [('', '')])[0][0]
  49. if name.endswith(end):
  50. return name
  51. return name + end
  52. def askdirectory(title, must=False, **parameters):
  53. while True:
  54. name: str = filedialog.askdirectory(title=title, **parameters)
  55. if name == '':
  56. if not must:
  57. raise NameError
  58. continue
  59. break
  60. return name