我创建了一个自定义窗口小部件,其中包含一个继承自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()
答案 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