__init__.py 2.6 KB

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