尝试从自定义小部件获取属性时的AttributeError

时间:2015-09-28 04:15:08

标签: python tkinter

我创建了一个自定义窗口小部件,其中包含一个继承自Entry的类(myEntry)。当我实例化myEntry时,它的方法工作正常,但是当我尝试获取其属性时,我得到了一个AttributeError。

以下是代码的简化版本。我写它只是为了测试这个类,并试图弄清楚我做错了什么。如果我点击 btTest1 ,我会得到“John Smith”。如果我点击 btTest2 ,我会得到“这也有效”。当我点击 btTest3 时,我得到以下内容:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
return self.func(*args)
  File "C:/Users/Raquel/Documents/Controle de Pedidos/CP2/teste.py", line 15, in <lambda>
    btTest3 = Button(myFrame, text="Get value", command=lambda: print(txtTest.myValue))
AttributeError: 'myEntry' object has no attribute 'myValue'

因此,似乎我可以使用x.fullName获取x(一个Person实例)的fullName属性的值,但是我无法使用txtTest获取txtTest(myEntry实例)的myValue属性的值。 myvalue的?我在这里缺少什么?

from tkinter import *

class main(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)

        x = Person("John Smith")
        myFrame = Frame(self, bd=10)
        myFrame.grid(row=0, column=0, sticky=NSEW)
        lbTest = Label(myFrame, text="My field*:")
        vTest = StringVar()
        txtTest = myEntry(myFrame, vTest, "testing")
        btTest1 = Button(myFrame, text="Get full name", command=lambda: print(x.fullName))
        btTest2 = Button(myFrame, text="Show", command=lambda: txtTest.show())
        btTest3 = Button(myFrame, text="Get value", command=lambda: print(txtTest.myValue))
        lbTest.grid(row=0, column=0, sticky=W)
        txtTest.grid(row=0, column=1, sticky=W)
        btTest1.grid(row=1, column=0)
        btTest2.grid(row=1, column=1)
        btTest3.grid(row=1, column=2)

class myEntry(Entry):
    def __init__(self, master, myVar, myValue):
        super().__init__(master, textvariable=myVar)
        self = Entry(master, textvariable=myVar)
        self.myValue = myValue

    def show(self):
        print("This works, too.")

class Person():
    def __init__(self, fullName):
        self.fullName = fullName

if __name__ == "__main__":
    root = Tk()
    main(root).pack(side=TOP, fill=BOTH, expand=True)
    root.mainloop()

1 个答案:

答案 0 :(得分:3)

问题是由于行 -

self = Entry(master, textvariable=myVar)

您正在将本地变量self更改为您创建的新Entry对象,然后为其设置.myValue属性。原始myEntry对象没有该属性,只有您创建的新Entry对象具有该属性,但在此之后它将被丢弃。

你真的不需要上面这一行,只有super().__init__(master, textvariable=myVar)行就足够了。您可以删除该行 - self = Entry(master, textvariable=myVar)。示例 -

class myEntry(Entry):
    def __init__(self, master, myVar, myValue):
        super().__init__(master, textvariable=myVar)
        self.myValue = myValue