在Python Tkinter中获取AttributeError。怎么解决?

时间:2016-03-22 09:29:43

标签: python tkinter

这只是Python Tkinter的一个简单实践。 这是代码:

from tkinter import *

class Window(Frame):
    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.master = master
        self.init_window()
    def init_window(self):
        self.master.title('GUI')
        self.pack(fill=BOTH, expand=1)

        text = Entry(self, bd=1)
        text.pack(side = TOP)

        submit_b = Button(self, text = 'submit', command = self.submit)
        submit_b.pack(side = BOTTOM)
    def submit(self):
        print(self.text.get())

root = Tk()
root.geometry('200x50')

app = Window(root)

root.mainloop()

结果如下:

enter image description here

所以我在'条目'中输入一个字符串。然后点击“提交”#39;按钮。该程序将打印出字符串。

然而,我得到了这个:

AttributeError: 'Window' object has no attribute 'text'

我不知道它为什么不起作用。请帮帮我!

1 个答案:

答案 0 :(得分:4)

您忘记了text声明中的self

    self.text = Entry(self, bd=1)
    self.text.pack(side = TOP)

因此text是一个局部变量,并且很快就被遗忘了#34}。在__init__完成之后。这样,它就是实例的成员变量,可以从submit内访问。请注意,除了例如,使用Java的this,如果找不到同名的局部变量,Python不会自动查找实例变量。 self 可选或仅用于消除歧义。

或者,您可以将text保留为本地变量,但也可以将submit设为本地变量:

    text = Entry(self, bd=1)
    text.pack(side = TOP)
    def submit():
        print(text.get())
    submit_b = Button(self, text = 'submit', command = submit)
    submit_b.pack(side = BOTTOM)

对于submit_b,您不需要self,因为您没有在__init__方法之外引用该按钮。事实上,在致电pack之后,您根本没有提到按钮,所以您甚至可以这样做:

    Button(self, text = 'submit', command = submit).pack(side = BOTTOM)