Python OOP重构Tkinter应用时按钮command触发AttributeError求助
问题原因及解决方法
你的核心问题是在__init__方法里直接把self赋值成了Frame对象,这会覆盖掉原本属于CreateBlank类实例的self。当按钮触发command=self.doNext时,实际调用的是那个Frame对象的doNext方法,但Frame类根本没有这个方法,所以抛出AttributeError。
修正后的代码
from tkinter import * from tkinter.font import Font # 让类直接继承Frame,符合Tkinter面向对象的常规写法 class CreateBlank(Frame): def __init__(self, master): # 调用父类Frame的初始化方法,同时传入样式参数 super().__init__(master, bg='white') self.pack(fill='both', expand=True) helv18 = Font(family='Helvetica', size=18, weight='bold') # 这里的self是CreateBlank类的实例,同时也是Frame组件,能正常调用doNext方法 self.Next_Button = Button(self, text="Next", font=helv18, command=self.doNext) self.Next_Button.pack(side=BOTTOM, pady=3) def doNext(self): print("Next!") # 测试运行 if __name__ == "__main__": root = Tk() app = CreateBlank(root) root.mainloop()
关键改动说明
- 继承Frame类:让自定义类成为Frame的子类,这样类的实例本身就是一个Frame组件,无需重新赋值
self。 - 使用super初始化父类:通过
super().__init__完成Frame的初始化,把当前实例变成合法的Frame组件,同时保留自定义类的方法。 - 正确绑定command:此时
self.doNext指向的是自定义类实例的方法,而非单纯的Frame对象,按钮点击时就能正常执行print("Next!")。
内容的提问来源于stack exchange,提问作者Ralph Bloch
相关产品推荐
相关产品推荐

