PySimpleGUI Table组件无法自动刷新 仅事件触发时更新问题求助
问题根因
PySimpleGUI的window.read()默认是阻塞调用,执行到该语句时程序会挂起等待,直到有用户交互事件(比如鼠标点击、窗口关闭)触发才会返回结果,继续执行下一轮循环。因此你写在read()之前的表格更新、刷新逻辑只有等read()返回后才会重新执行,自然就出现了只有事件触发时才会刷新的现象。
解决方法
给read()方法添加timeout参数(单位为毫秒),设置后如果超过指定时长没有事件触发,read()会自动返回,让主循环可以持续执行,实现表格的自动刷新。
注意事项
timeout的数值可以根据实际需要的刷新频率调整,比如设置为100代表每秒刷新10次,不需要高频刷新的话可以适当调大数值,降低性能消耗- 超时触发时返回的事件值为
sg.TIMEOUT_EVENT,不需要额外处理的话直接忽略即可 - 你原有代码中表格点击事件的判断存在拼写错误,
+CICKED+需要改为+CLICKED+,否则点击事件无法正常触发 update方法执行后会自动触发界面更新,不需要额外调用refresh()属于冗余操作,可以直接省略
修正后核心代码示例
def run(self): while True: self.window['-TABLE-'].update(values = make_data(10,10)) self.event, self.values = self.window.read(timeout=100) # 新增timeout参数 if self.event == sg.WIN_CLOSED: break elif isinstance(self.event, tuple) and self.event[0:2] == ('-TABLE-', '+CLICKED+'): # 修正拼写错误 row, col = self.event[2] selection = self.values['-TABLE-'] previous_select_row = selection[0] if selection else 'None' # 后续业务逻辑
进阶优化(可选)
如果make_data()生成数据的逻辑比较耗时,直接放在主循环里会导致界面卡顿的话,可以将数据生成逻辑放到子线程中执行,数据生成完成后再通知主线程更新表格即可。
内容的提问来源于stack exchange,提问作者addawaddawoo
相关产品推荐
相关产品推荐

