Tkinter计时器问题:time.sleep致窗口卡顿,求正常计时方案
修复Tkinter倒计时计时器卡顿问题
原代码的核心问题有两个:
- 用
while循环阻塞了Tkinter的主事件循环,导致窗口无法响应任何操作 - 每次调用
timer()都会重置d=60,且循环内递归调用timer()会引发大量重复任务,逻辑彻底混乱
下面是修复后的代码:
from tkinter import * def timer(remaining=60): if remaining > 0: m, s = divmod(remaining, 60) mo = 'Время:{:02d}:{:02d}'.format(m, s) tablo['text'] = mo # 1秒后继续调用timer,传入递减后的剩余时间 window.after(1000, timer, remaining - 1) else: tablo['text'] = 'Время: 00:00' window = Tk() window.geometry('900x600') tablo = Label(text='Время: 60', font="Courier 20 bold") tablo.place(x=10, y=10) start = Button(text="start", command=timer, width=10, font="Courier 15 bold") start.place(x=300, y=10) def exit_app(): window.quit() exit_btn = Button(text="exit", command=exit_app, width=10, font="Courier 15 bold") exit_btn.place(x=600, y=10) window.mainloop()
关键改动说明:
- 把剩余时间
remaining作为timer函数的参数,默认值设为60,每次递归调用时传递递减后的数值,避免重复重置时间 - 移除
while循环,改用window.after()实现延迟1秒后更新时间,完全不阻塞Tkinter的主事件循环 - 重命名了原
exit按钮的变量名(exit是Python内置关键字,避免命名冲突)
修改后,计时器会正常每秒递减,窗口不会卡顿,按钮操作也能正常响应。
内容的提问来源于stack exchange,提问作者Дмитрий
相关产品推荐
相关产品推荐

