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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:06:04