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
相关产品推荐
相关产品推荐

