运行Tkinter脚本出现AttributeError: 'Application'对象无'tk'属性求助
解决Tkinter中的AttributeError: 'Application' object has no attribute 'tk'错误
这个错误的核心原因是你的Application类继承了tk.Frame,但没有在构造函数中调用父类的初始化方法,导致Frame的必要属性(比如tk)没有被创建。除此之外,代码里还有几个小问题会导致按钮功能异常,我来帮你一一修正:
问题1:未调用父类构造函数
当你继承tk.Frame时,必须在子类的__init__方法中调用父类的__init__,否则Frame的初始化逻辑不会执行,也就无法生成tk这类必要属性。解决方法是在__init__开头添加:
super().__init__(master)
或者兼容旧版本Python的写法:
tk.Frame.__init__(self, master)
问题2:frame.pack缺少括号
frame.pack只是引用了这个方法对象,并没有执行它,必须加上括号frame.pack()才能把frame添加到窗口中。
问题3:按钮command参数错误
你写的command=self.Print()会在创建按钮时立即执行Print方法,而不是等到按钮被点击时触发。正确的写法是去掉括号,直接传入方法引用:command=self.Print。
另外,quit是主窗口root的方法,你的Application类并没有quit方法,所以command=self.quit()不仅会立即执行,还会引发另一个错误。应该改为command=self.master.quit,直接调用主窗口的退出方法。
修正后的完整代码
import tkinter as tk class Application(tk.Frame): def __init__(self, master): # 调用父类Frame的构造函数,完成初始化 super().__init__(master) self.master = master self.pack() # 将Application自身作为主frame添加到窗口 # 创建Print按钮,command传入方法引用 self.PRINT = tk.Button(self, text='Print', fg='Red', command=self.Print) self.PRINT.pack(side='left') # 创建Quit按钮,调用主窗口的quit方法 self.QUIT = tk.Button(self, text='Quit', fg='Red', command=self.master.quit) self.QUIT.pack(side='left') def Print(self): print('at least somethings working') root = tk.Tk() b = Application(root) root.mainloop()
现在运行这段代码,窗口会正常显示,点击Print按钮会输出指定文本,点击Quit按钮可以正常关闭窗口,也不会再出现AttributeError了。
内容的提问来源于stack exchange,提问作者Jungar
相关产品推荐
相关产品推荐

