Tkinter实现计时器时变量直接归零,不按秒倒计时如何解决?
问题原因
- 第一:你的
while循环没有加任何阻塞逻辑,会以CPU最快的速度连续执行,瞬间就把time_1从60减到0。循环走完时你已经启动了60个延时1秒的更新任务,等1秒后执行更新时time_1早就变成0,自然看不到倒计时效果。 - 第二:Tkinter的UI组件更新操作必须在主线程执行,用
threading.Timer开子线程修改Label属性属于非线程安全操作,容易触发界面崩溃、无响应等异常。 - 第三:你写的
while time_1 and time_2 > 0判断逻辑存在问题,实际判定规则是time_1不为0 且 time_2大于0,并不是你预期的「两个变量都大于0」的效果。
修复方案
推荐使用Tkinter自带的after()方法实现延时调度,不需要额外开启线程,逻辑更简单也更安全,修复后的可运行代码如下:
import tkinter as tk from tkinter import ttk root = tk.Tk() root.title("Chess Timer") root.minsize(250,250) time_1 = 60.0 time_2 = 60.0 timer_1 = ttk.Label(root, text=time_1) timer_1.grid(column=1, row=0, padx=20) timer_2 = ttk.Label(root, text=time_2) timer_2.grid(column=2, row=0, padx=20) def update_timer(): global time_1, time_2 # 两个计时器都大于0时才继续倒计时 if time_1 > 0 and time_2 > 0: time_1 -= 1 # 更新界面显示 timer_1.config(text=time_1) timer_2.config(text=time_2) # 1000毫秒后再次调用自身,实现每秒执行一次的效果 root.after(1000, update_timer) # 启动倒计时 update_timer() root.mainloop()
内容的提问来源于stack exchange,提问作者Gabriel Santiago
相关产品推荐
相关产品推荐

