You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在关闭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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:54:04