我正在尝试使用Tkinter创建一个gui,该gui可以获取用户名和密码并连接到远程服务器并执行功能。我拍了一些凌乱的代码,它或多或少地起作用了,但是当我试图在一个整洁的模块中重新创建它时,它就坏了。它可能是新手python错误,但我找不到它。编辑:澄清,当它工作时,唯一的类是setupGui和该类下的任何方法。现在,我已将gui与方法分开,它不起作用。
class setupGui(object):
def __init__(self, parent):
##omited general frame stuff
self.userIn = ttk.Entry(self.topFrame, width = 20)
self.userIn.grid(row = 1, column = 1)
self.passIn = ttk.Entry(self.topFrame, width = 20, show ="*")
self.passIn.grid(row = 2, column = 1)
#Buttons
self.setupbtn = ttk.Button(self.topFrame, text = "Start Setup", command = setup().startSetup())
self.setupbtn.grid(row = 3, column = 0, pady = 10)
class setup(object):
def__init__(self):
self.userName = setupGui.userIn.get()
self.userPass = setupGui.passIn.get()
def startSetup(self):
self.another_related_fucntion # about 4 related functions actually
if __name__ == '__main__':
root = Tk()
gui = setupGui(root)
root.mainloop()
而且,如果我没有将命令附加到按钮上,则一切正常(但是看起来很漂亮,但确实蹲了一下)。当我附加命令时,出现此错误:
Traceback (most recent call last):
File "macSetup.py", line 211, in <module>
gui = setupGui(root)
File "macSetup.py", line 45, in __init__
self.setupbtn = ttk.Button(self.topFrame, text = "Start Setup", command = setup().startSetup())
File "macSetup.py", line 69, in __init__
self.userName = setupGui.userIn.get()
AttributeError: type object 'setupGui' has no attribute 'userIn'
最佳答案
在您的代码中,userIn
被设置为setupGui
对象的实例变量,而不是setupGui
类本身的属性。
最简单的解决方案是合并setupGui
和setup
类,以将startSetup
作为setupGui
的方法移入,然后在初始化command=self.startSetup
时使用setupbtn
-这将startSetup
称为绑定(bind)方法,因此self
应该引用setupGui
对象然后可以使用例如开启self.userIn.get()
和self.passIn.get()
。
如果您希望将setup
类中的逻辑与setupGui
类分开,则可以像这样将其分开:
class setup(object):
def __init__(self, username, userpass):
self.userName = username
self.userPass = userpass
def startSetup(self):
# as before
然后将此方法添加到
setupGui
类:def dosetup(self):
setup(self.userIn.get(), self.passIn.get()).startSetup()
并使用
Button
实例化command=self.dosetup
。 (我个人会将setup
类设为一个独立的函数,但我不知道startSetup
例程实际上有多复杂,因此我认为您有充分的理由将其设为一个类。)关于python - 具有多个类和Tkinter的Python属性错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10658376/