tk_gui.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import os.path
  2. import threading
  3. import tkinter as tk
  4. from tkinter import ttk, filedialog, messagebox
  5. from PIL import Image, ImageTk
  6. import sv_ttk
  7. class ImageApp:
  8. def __init__(self, root):
  9. self.image_path = None
  10. self.image_name = None
  11. self.root = root
  12. self.root.title("车牌识别")
  13. # 主布局为横向分割
  14. self.main_frame = ttk.Frame(root)
  15. self.main_frame.pack(fill='both', expand=True)
  16. self.left_frame = ttk.Frame(self.main_frame)
  17. self.left_frame.pack(side='left', fill='both', expand=True, padx=10, pady=10)
  18. self.right_frame = ttk.Frame(self.main_frame)
  19. self.right_frame.pack(
  20. side='right', fill='both', expand=True, padx=10, pady=10
  21. )
  22. self.open_button = ttk.Button(
  23. self.left_frame, text="选择图片", command=self.load_image
  24. )
  25. self.open_button.pack(anchor="n")
  26. self.origin_label = ttk.Label(self.left_frame, text="Origin Image")
  27. self.origin_label.pack(pady=5)
  28. self.origin_canvas = tk.Label(self.left_frame, borderwidth=2, relief="ridge")
  29. self.origin_canvas.pack(fill='both', expand=True)
  30. self.save_button = ttk.Button(
  31. self.right_frame, text="保存图片", command=self.save_image
  32. )
  33. self.save_button.pack(anchor="n")
  34. self.handle_label = ttk.Label(self.right_frame, text="Handle Image")
  35. self.handle_label.pack(pady=5)
  36. # ["raised", "sunken", "flat", "ridge", "solid", "groove"]
  37. self.handle_canvas = tk.Label(self.right_frame, borderwidth=2, relief="groove")
  38. self.handle_canvas.pack(fill='both', expand=True)
  39. self.origin_img = None
  40. self.handled_img = None
  41. self.tk_origin = None
  42. self.tk_handled = None
  43. def load_image(self):
  44. path = filedialog.askopenfilename(
  45. filetypes=[("Image files", "*.jpg *.png *.jpeg *.bmp *.gif")]
  46. )
  47. if path:
  48. self.origin_img = Image.open(path)
  49. width ,height = self.origin_canvas.winfo_width(), self.origin_canvas.winfo_height()
  50. print(width,height)
  51. self.tk_origin = ImageTk.PhotoImage(self.origin_img.resize((width , height)))
  52. self.origin_canvas.config(image=self.tk_origin)
  53. self.image_name = path.split("/")[-1]
  54. self.image_path = path
  55. threading.Thread(target=self.process_image, daemon=True).start()
  56. def handle_image(self):
  57. self.handled_img = self.origin_img.convert("L")
  58. width, height = (
  59. self.origin_canvas.winfo_width(),
  60. self.origin_canvas.winfo_height(),
  61. )
  62. self.tk_handled = ImageTk.PhotoImage(self.handled_img.resize((width , height )))
  63. self.handle_canvas.config(image=self.tk_handled)
  64. def process_image(self):
  65. # 耗时操作在线程中执行
  66. from detect_plate import start
  67. self.handle_label.config(text="Handle Image (正在识别中...)")
  68. start(self.image_path)
  69. cwd = os.getcwd()
  70. recognize_result_path = os.path.join("result", self.image_name)
  71. recognize_result_path = cwd + "\\" + recognize_result_path
  72. print(recognize_result_path)
  73. # 回到主线程更新 UI(Tkinter 所有 UI 更新必须在主线程)
  74. def update_ui():
  75. result = Image.open(recognize_result_path)
  76. self.handled_img = result
  77. width, height = (
  78. self.origin_canvas.winfo_width(),
  79. self.origin_canvas.winfo_height(),
  80. )
  81. self.tk_handled = ImageTk.PhotoImage(self.handled_img.resize((width, height)))
  82. self.handle_canvas.config(image=self.tk_handled)
  83. self.handle_label.config(text="Handle Image")
  84. self.root.after(0, update_ui)
  85. def save_image(self):
  86. if self.handled_img:
  87. save_path = filedialog.asksaveasfilename(
  88. title="保存图像",
  89. initialdir=os.path.expanduser("~/Downloads"),
  90. initialfile=self.image_name,
  91. defaultextension=".png",
  92. filetypes=[("PNG files", "*.png"), ("All files", "*.*")],
  93. )
  94. if save_path:
  95. self.handled_img.save(save_path)
  96. messagebox.showinfo("保存成功", f"图像已保存到:{save_path}")
  97. else:
  98. messagebox.showwarning("未处理图像", "请先选择图像再保存。")
  99. def center_window(win, width, height):
  100. screen_width = win.winfo_screenwidth()
  101. screen_height = win.winfo_screenheight()
  102. x = (screen_width - width) // 2
  103. y = (screen_height - height) // 2
  104. win.geometry(f"{width}x{height}+{x}+{y}")
  105. if __name__ == "__main__":
  106. root = tk.Tk()
  107. app = ImageApp(root)
  108. sv_ttk.set_theme("dark")
  109. center_window(root, 1600, 800 )
  110. root.mainloop()