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

PySimpleGUI检测循环的中断退出实现问题求助

问题解决:PySimpleGUI持续检测同时响应停止按钮

原代码的核心问题是内层循环里的window.read()是阻塞调用——程序会卡在这行,直到有用户事件(比如点击按钮)才会继续执行。这就导致只有当没有任何按钮被点击时,检测代码才会跑一次,之后又回到等待事件的状态,无法实现持续检测的需求。

修复方案

把内层循环中的window.read()改成非阻塞读取,通过设置timeout=0让它立即返回,不管有没有事件。这样循环就能持续执行检测逻辑,同时每次循环都会检查是否有"Stop Detection"事件。

修改后的内层循环代码:

elif event =='Start Detection':
    while True:
        # 非阻塞读取事件,timeout=0表示立即返回
        event, values = window.read(timeout=0)
        # 处理Stop事件,退出内层循环
        if event == 'Stop Detection':
            break
        # 处理主窗口的退出事件
        if event in (None, 'Quit'):
            # 先退出内层循环,再让外层循环处理退出
            break
        # 执行检测逻辑
        sct_img = sct.grab(bounding_box)
        videoimage = changeImage(x, np.array(sct_img))
        ServerUpdate = UpdateServer(videoimage[1], videoimage[2], videoimage[3], videoimage[4],
                                   videoimage[5], videoimage[6], videoimage[7], videoimage[8],
                                   videoimage[9], videoimage[10], videoimage[11], videoimage[12])
        # 保留OpenCV的等待,避免窗口无响应
        k = cv.waitKey(1) & 0xFF
        if k == ord('q'):
            break
    cv.destroyAllWindows()

关键说明

  • window.read(timeout=0):非阻塞模式,立即返回当前事件(如果有)或者timeout事件(无事件时),不会卡住程序,保证检测逻辑能持续运行。
  • 内层循环中也要处理Quit或窗口关闭事件,避免用户点击主窗口关闭按钮时程序无响应。
  • cv.waitKey(1)不能删,它负责处理OpenCV窗口的事件循环,防止窗口冻结。

另外,原代码中window.close少了括号,应该是window.close(),建议修正。

内容的提问来源于stack exchange,提问作者Beau Matthews

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:05