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

如何修复AttributeError: '_tkinter.tkapp'对象无'timer_left'属性错误?

Tkinter计时器错误修复:AttributeError: '_tkinter.tkapp' object has no attribute 'timer_left'

错误根源

  1. 初始化阶段引用未定义属性:在__init__中创建self.timer标签时,直接使用self.timer_left,但该属性仅在点击按钮触发countdown后才会被赋值,程序启动时不存在这个属性,因此触发AttributeError。
  2. 界面阻塞问题:原代码用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,提问作者Матвей Зуев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:24:24