Ошибка атрибута Python tkinter: у класса нет атрибута - PullRequest
0 голосов
/ 15 ноября 2018

Я прочитал все похожие вопросы, но не могу понять, как решить эту ошибку. Я создаю таймер обратного отсчета, который обновит и покажет оставшееся время на ярлыке 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 голосов
/ 15 ноября 2018

Похоже, вы неправильно понимаете, как работает атрибут класса или что именно делает 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...