无需使用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
相关产品推荐
相关产品推荐

