如何避免使用PySimpleGUI创建的窗口执行任务时出现无响应问题
问题原因
你当前的窗口无响应是因为q.get()是阻塞调用:队列中没有消息时,主线程(GUI线程)会一直卡在等待队列返回的状态,无法处理窗口重绘、用户交互等GUI事件,最终表现为窗口无响应。
非OOP的可行修改方案
不需要改整体逻辑,只需要把原来的死循环替换为PySimpleGUI自带的带超时的窗口读取逻辑,既可以轮询队列进度,又能保证GUI线程正常响应事件:
修改后的代码片段
elif event == "Parse": if layout == 1: q = queue.Queue() layout = [[GUI.Text('Parsing...')], [GUI.ProgressBar(1, orientation='h', size=(20, 20), key='progressbar', bar_color = ('navy','white'))]] window1 = GUI.Window('Progress', layout).Finalize() progress_bar = window1['progressbar'] t1 = threading.Thread(target=ParseTSLogs, daemon=True, args = (q,)) t1.start() temp = 0 # 替换原来的阻塞循环 while True: # 每100毫秒检查一次窗口事件和队列状态,不会阻塞GUI event, _ = window1.read(timeout=100) # 处理用户手动关闭进度窗口的场景 if event == GUI.WIN_CLOSED: break # 队列非空时才读取进度,避免阻塞 if not q.empty(): temp = q.get() progress_bar.UpdateBar(temp, 3) # 进度完成后退出循环 if temp == 3: break window1.close()
注意事项
- 确保你的
ParseTSLogs函数会按执行进度依次把进度值1/2/3put到队列中,必须要put3才能让循环自动退出 - 超时时间(代码中的100,单位毫秒)可以自行调整,值越小进度更新越灵敏,CPU占用越高,100-200毫秒是比较平衡的选择
内容的提问来源于stack exchange,提问作者Enver
相关产品推荐
相关产品推荐

