如何将Python录屏代码整合到Tkinter GUI,解决窗口冻结无法停止问题
Tkinter 录屏功能整合解决方案
核心问题原因
- 原始录屏函数使用
while True死循环,直接绑定Tkinter按钮会阻塞GUI主线程,导致窗口无响应 - 此前多线程方案未设置可控的停止标识,无法主动终止录屏循环,导致进程残留
完整整合代码
import cv2 import numpy as np from PIL import ImageGrab import threading from tkinter import * # 全局配置 screen_size = (1366, 768) # 录屏状态标志位 is_recording = False record_thread = None output = None def recorder(): global is_recording, output fourcc = cv2.VideoWriter_fourcc(*"XVID") fps = 20.0 output = cv2.VideoWriter("output.avi", fourcc, fps, (screen_size)) # 用状态标志位替代死循环,支持主动停止 while is_recording: img = ImageGrab.grab() img_np = np.array(img) frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB) output.write(frame) # 循环结束后释放资源 output.release() cv2.destroyAllWindows() def start_record(): global is_recording, record_thread if not is_recording: is_recording = True # 录屏逻辑放到独立子线程执行,不阻塞GUI主线程 record_thread = threading.Thread(target=recorder, daemon=True) record_thread.start() def stop_record(): global is_recording if is_recording: is_recording = False # 等待录屏线程正常结束,保证资源释放 record_thread.join() # 窗口关闭回调,避免进程残留 def on_closing(): stop_record() window.destroy() # GUI初始化 window = Tk() window.geometry("500x200+460+170") window.resizable(0, 0) window.configure(bg='#030818') window.protocol("WM_DELETE_WINDOW", on_closing) Label(window, text="Recording", fg="white",bg="#030818",font=("Helvetica", 23, "bold")).pack() Button(window, text="Start Recording", bd=0, bg="gray",fg="white",font=("Helvetica", 15, "bold"), command=start_record).place(x=170,y=60) Button(window, text="Stop Recording", bd=0, bg="gray",fg="white",font=("Helvetica", 15, "bold"), command=stop_record).place(x=170,y=110) window.mainloop()
功能说明
- 点击Start Recording按钮启动录屏,GUI不会出现冻结情况
- 点击Stop Recording按钮可主动终止录屏,视频自动保存为当前目录下的
output.avi - 直接点击窗口关闭按钮也会自动停止录屏,不会残留后台进程
内容的提问来源于stack exchange,提问作者Shikhar Adhikari
相关产品推荐
相关产品推荐

