如何在关闭Tkinter窗口时终止OpenCV摄像头录制的无限循环
解决关闭Tkinter窗口同步停止摄像头录制的实现方案
核心实现逻辑是通过全局终止标志位绑定窗口关闭事件,实现两个线程的同步退出,修改后的可用代码如下:
import cv2 from tkinter import * from threading import Thread import os # 录制终止标志位 stop_recording = False # 视频录制功能 def capture(): # 提前创建存储目录避免报错 if not os.path.exists('sample'): os.mkdir('sample') cv2.namedWindow('video', cv2.WINDOW_NORMAL) cv2.resizeWindow('video', 150, 150) cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') videoWriter = cv2.VideoWriter('sample/sample.mp4', fourcc, 18.0, (640, 480)) while not stop_recording: ret, frame = cap.read() if ret: cv2.imshow('video', frame) videoWriter.write(frame) # 必须加waitKey,否则OpenCV窗口无法正常刷新 if cv2.waitKey(1) & 0xFF == ord('q'): break else: break # 资源释放 cap.release() videoWriter.release() cv2.destroyAllWindows() # Tkinter窗口功能 def window(): root = Tk() root.geometry('300x200') # 绑定窗口关闭事件 def on_close(): global stop_recording stop_recording = True root.destroy() root.protocol("WM_DELETE_WINDOW", on_close) root.mainloop() # 线程启动逻辑 if __name__ == "__main__": t1 = Thread(target=window) t2 = Thread(target=capture) t1.start() t2.start() # 等待两个线程依次退出 t1.join() t2.join()
关键修改点说明
- 新增全局布尔变量
stop_recording作为录制线程的终止信号,初始值为False - 给Tkinter窗口绑定
WM_DELETE_WINDOW关闭事件,点击关闭按钮时先修改终止标志位,再销毁窗口 - 修正原代码缩进错误:将帧读取后的判断逻辑放入录制循环内部
- 录制循环新增终止条件判断,检测到
stop_recording为True时自动退出循环释放资源 - 新增OpenCV必要的
waitKey调用,保证预览窗口正常刷新 - 修复原线程启动逻辑的错误,避免重复启动线程抛出异常
- 新增存储目录自动创建逻辑,避免路径不存在导致的写文件报错
内容的提问来源于stack exchange,提问作者Sudeepa Alex
相关产品推荐
相关产品推荐

