如何修复AttributeError: '_tkinter.tkapp'对象无'timer_left'属性错误?
Tkinter计时器错误修复:AttributeError: '_tkinter.tkapp' object has no attribute 'timer_left'
错误根源
- 初始化阶段引用未定义属性:在
__init__中创建self.timer标签时,直接使用self.timer_left,但该属性仅在点击按钮触发countdown后才会被赋值,程序启动时不存在这个属性,因此触发AttributeError。 - 界面阻塞问题:原代码用
while循环+time.sleep(1)会卡住Tkinter的事件循环,导致界面无法响应,倒计时也无法实时显示。
修复方案
- 初始化时给
self.timer_left设置默认值,避免引用未定义属性。 - 使用Tkinter内置的
after()方法替代循环和sleep,实现非阻塞的定时更新。 - 实时更新Label的文本内容,展示倒计时状态。
- 移除无效的try-except代码块(创建Entry组件不会抛出ValueError)。
修正后的完整代码
import tkinter as tk from tkinter import ttk from tkinter.messagebox import showinfo import datetime class Timer(tk.Tk): def __init__(self): super().__init__() self.title('Таймер') self.geometry('600x250') self.lbl = ttk.Label(self, text='Таймер') self.lbl.grid(column=3, row=0, pady=20) self.hours = ttk.Label(self, text='Часов: ', width=10) self.hours.grid(column=0, row=1) self.minutes = ttk.Label(self, text='Минут: ', width=10) self.minutes.grid(column=2, row=1) self.seconds = ttk.Label(self, text='Секунд: ', width=10) self.seconds.grid(column=4, row=1) self.timer_hours = ttk.Entry(self, width=10) self.timer_minutes = ttk.Entry(self, width=10) self.timer_seconds = ttk.Entry(self, width=10) self.timer_hours.grid(column=1, row=1) self.timer_minutes.grid(column=3, row=1) self.timer_seconds.grid(column=5, row=1) self.start = ttk.Button(self, text='Запустить таймер', command=self.countdown) self.start.grid(row=2, column=3, padx=5, pady=10) # 初始化timer_left和标签文本 self.timer_left = datetime.timedelta(seconds=0) self.timer = ttk.Label(self, text=str(self.timer_left), width=10) self.timer.grid(row=3, column=3, pady=25) def countdown(self): try: h = int(self.timer_hours.get()) m = int(self.timer_minutes.get()) s = int(self.timer_seconds.get()) except ValueError: showinfo(title='Ошибка', message='Введите целые числа для времени!') return total_seconds = h * 3600 + m * 60 + s self.update_timer(total_seconds) def update_timer(self, remaining): if remaining > 0: self.timer_left = datetime.timedelta(seconds=remaining) self.timer.config(text=str(self.timer_left)) # 1秒后递归调用自身,实现倒计时 self.after(1000, self.update_timer, remaining - 1) else: self.timer.config(text='Время вышло!') showinfo(title='Таймер', message='Время истекло!') if __name__ == '__main__': timer = Timer() timer.mainloop()
内容的提问来源于stack exchange,提问作者Матвей Зуев
相关产品推荐
相关产品推荐

