Python tkinter属性错误:类没有属性

时间:2018-11-15 13:18:09

标签: python-3.x tkinter

我已经阅读了所有类似的问题,但仍然不知道如何解决该错误。我正在创建一个倒数计时器,该计时器将更新并在'timeLeft'标签(下面的代码)上显示剩余时间。但是,当我尝试使用功能start_count()更新标签时,仍然会出现此错误:

self.timeLeft.config(text= str(mins) +"分"+ str(secs) +"秒")
AttributeError: 'PracticePage' object has no attribute 'timeLeft'

下面是我的代码的一部分:

    class PracticePage(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            timeLeft = tk.Label(self,text= "")
            backButton = ttk.Button(self, text="やり直す", command = lambda: controller.show_frame(StartPage))
            homeButton = ttk.Button(self, text="サインアウト", command = lambda:controller.show_frame(SignInPage))

            timeLeft.pack()
            backButton.pack()
            homeButton.pack()
            self.start_count(120)

        def start_count(self,t):
            global mins
            global secs
            time = t
            while time>0:
                mins, secs = divmod(time,60)
                mins = round(mins)
                secs = round(secs)
                self.timeLeft.config(text= str(mins) +"分"+ str(secs) +"秒")
                time = time-1
                if (time==0):
                   break

有人可以帮忙吗?预先谢谢你。

1 个答案:

答案 0 :(得分:0)

您可能误解了类属性的工作原理或self.的确切作用。

self.前缀用于告诉类特定的变量或函数被分配为类属性或方法。

在这里,您已经在__init__方法中创建了一个名为timeLeft的变量,但是稍后尝试使用self.timeLeft访问它。由于timeLeft仅被定义为__init__方法的局部变量,因此无法使用。

要解决此问题,只需确保将timeLeft更新为代码中任何位置的self.timeLeft,然后就可以正常工作了。

更新的课程:

class PracticePage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.timeLeft = tk.Label(self,text= "")
        backButton = ttk.Button(self, text="やり直す", command = lambda: controller.show_frame(StartPage))
        homeButton = ttk.Button(self, text="サインアウト", command = lambda:controller.show_frame(SignInPage))

        self.timeLeft.pack()
        backButton.pack()
        homeButton.pack()
        self.start_count(120)

    def start_count(self,t):
        global mins
        global secs
        time = t
        while time>0:
            mins, secs = divmod(time,60)
            mins = round(mins)
            secs = round(secs)
            self.timeLeft.config(text= str(mins) +"分"+ str(secs) +"秒")
            time = time-1
            if (time==0):
               break