import threading from tkinter import * from tkinter import ttk from PIL import Image, ImageTk from gesture_recognition import start_recognition, stop_recognition, release_camera, keep_running WINDOW_WIDTH = 800 WINDOW_HEIGHT = 705 def main(): show_welcome_screen() def set_window_position(window, width, height): screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() x = (screen_width - width) // 2 y = (screen_height - height) // 2 window.geometry(f'{width}x{height}+{x}+{y}') def show_welcome_screen(): welcome = Tk() welcome.title("欢迎使用") set_window_position(welcome, WINDOW_WIDTH, WINDOW_HEIGHT) bg_image = Image.open("1.png") bg_image = bg_image.resize((WINDOW_WIDTH, WINDOW_HEIGHT), Image.Resampling.LANCZOS) bg_image = ImageTk.PhotoImage(bg_image) background_label = Label(welcome, image=bg_image) background_label.image = bg_image # 保持引用,防止垃圾回收 background_label.place(relwidth=1, relheight=1) label = Label(welcome, text="欢迎使用手势识别系统", font=('Helvetica', 24, 'bold'), bg="lightblue", fg="white") label.place(relx=0.5, rely=0.4, anchor=CENTER) btn_continue = Button(welcome, text="继续", command=lambda: [welcome.destroy(), show_main_screen()], font=('Helvetica', 14), bg="yellow", fg="black", relief=SOLID) btn_continue.place(relx=0.5, rely=0.6, anchor=CENTER) welcome.mainloop() def show_main_screen(): global window, canvas window = Tk() window.title("手势识别") set_window_position(window, WINDOW_WIDTH, WINDOW_HEIGHT) style = ttk.Style(window) style.theme_use('clam') frame_controls = Frame(window, bg='lightgray', pady=10) frame_controls.pack(fill=X) frame_video = Frame(window, bg='white') frame_video.pack(fill=BOTH, expand=True) canvas = Canvas(frame_video, bg='black') canvas.pack(fill=BOTH, expand=True, padx=20, pady=20) status_label = Label(frame_controls, text="等待开始...", font=('Helvetica', 14), bg='lightgray') status_label.pack(side=LEFT, padx=(10, 20)) btn_start = ttk.Button(frame_controls, text="开始", command=lambda: start_thread(window, canvas, status_label)) btn_start.pack(side=LEFT, padx=10) btn_stop = ttk.Button(frame_controls, text="停止", command=lambda: stop_recognition_with_label(status_label)) btn_stop.pack(side=LEFT, padx=10) btn_exit = ttk.Button(frame_controls, text="退出", command=lambda: exit_program()) btn_exit.pack(side=LEFT, padx=10) style = ttk.Style(window) style.configure('TButton', font=('Helvetica', 14)) window.mainloop() def start_thread(root, canvas, status_label): global keep_running if not keep_running: status_label.config(text="正在识别...") threading.Thread( target=lambda: start_recognition(root, callback=lambda img: update_canvas(canvas, img))).start() def stop_recognition_with_label(status_label): stop_recognition() status_label.config(text="已停止") def exit_program(): global window stop_recognition() release_camera() window.destroy() def update_canvas(canvas, img): img = Image.fromarray(img) imgtk = ImageTk.PhotoImage(image=img) canvas.create_image(320, 240, image=imgtk) canvas.image = imgtk canvas.update() if __name__ == "__main__": main()