Объект ошибки Python Tkinter не имеет атрибута

Поэтому я делаю программу, похожую на аркадные игры. Я хочу, чтобы labelGuess появлялся в окне верхнего уровня после щелчка по фрейму, но это дает мне эту ошибку:

AttributeError: объект «Окно» не имеет атрибута «окно»

Вот код:

from tkinter import *
from tkinter import font
import time

class Window(Frame):

    def __init__(self, master):

        Frame.__init__(self, master)
        self.master = master

        master.title("Arcade Games")
        master.geometry("800x600+560+240")

        b = Button(self, text="Guess the number", command=self.new_window)
        b.pack(side="top")
        self.customFont = font.Font(master, font="Heraldica", size=12)

        self.guess_number()

    def new_window(self):

        id = "Welcome to the 'Guess your number' game!\nAll you need to do is follow the steps\nand I will guess your number!\n\nClick anywhere to start!"
        self.window = Toplevel(self.master)
        frame = Frame(self.window)
        frame.bind("<Button-1>", self.guess_number)
        frame.pack()
        self.window.title("Guess the number")
        self.window.geometry("400x300+710+390")
        label = Label(self.window, text=id, font=self.customFont)
        label.pack(side="top", fill="both", padx=20, pady=20)

    def guess_number(self):


        labelGuess = Label(self.window, text="Pick a number between 1 and 10", font=self.customFont)
        time.sleep(2)
        labelGuess.pack(fill=BOTH, padx=20, pady=20)

if __name__ == "__main__":
    root = Tk()
    view = Window(root)
    view.pack(side="top", fill="both", expand=True)
    root.mainloop()

person ToucaN    schedule 12.01.2016    source источник


Ответы (2)


Ваш первоначальный вызов guess_number в вашем методе инициализатора, вероятно, вызывается до того, как вы нажмете кнопку и вызовете обратный вызов события new_window. В guess_number вы пытаетесь передать self.window в качестве аргумента Label(), но в то время это будет не определено.

person Community    schedule 12.01.2016
comment
не вероятно - определенно. Это прямо в __init__: self.guess_number() - person Bryan Oakley; 12.01.2016

Во-первых, вы никогда не должны создавать новый атрибут из метода __init__.

При этом Майк указал причину проблемы: вы создали объект окна внутри метода new_window, но не вызвали его.

Вы должны вызвать new_window перед вызовом guess_number или вызвать один внутри другого.

Я предлагаю вам установить window в None и вызвать new_window внутри метода __init__, а затем (после этого) вызвать guess_number.

person Arĥimedeς ℳontegasppα ℭacilhας    schedule 12.01.2016