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

无需使用after()函数实现Tkinter窗口定时自动更新

解决Tkinter浮窗定时更新的递归崩溃问题

你的代码存在关键错误,直接导致了所谓的"992次限制"崩溃——你在调用after时直接执行了函数,而非传递函数对象。这种写法会触发Python的递归栈溢出(默认递归深度限制约1000),和Tkinter本身的after机制无关。

错误代码问题点

原代码中:

ws.after(1000, my_functions())

这里的my_functions()是立即执行函数,并把返回值(None)传给after,会导致函数瞬间递归调用自己,直到达到Python的递归深度上限,最终崩溃。

正确的定时更新写法

只需修改启动定时任务的方式,传递函数对象而非调用函数,同时保持after的任务添加逻辑:

def my_function():
    print('task done')
    # 给事件队列添加下一次任务,传递函数对象
    ws.after(1000, my_function)

# 启动定时任务,同样传递函数对象
ws.after(1000, my_function)

这种写法中,my_function每次执行完毕后,只是向Tkinter的事件队列中添加一个新的延迟任务,并非真正的栈递归,因此不会有调用次数限制,可以持续运行。

额外优化:避免任务重叠

如果你的浮窗更新逻辑执行时间可能超过1-2秒的间隔,可以添加标记变量,防止事件队列堆积任务:

is_updating = False

def my_function():
    global is_updating
    if is_updating:
        return
    is_updating = True
    
    # 这里写你的浮窗更新逻辑
    print('task done')
    
    is_updating = False
    ws.after(1000, my_function)

ws.after(1000, my_function)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:20:42