Python Tkinter类对象:外部函数修改类内按钮文本的实现
解决方法
你遇到的AttributeError是因为changeButtonText是类外部的独立函数,并非GUI类的方法,用self.changeButtonText会试图从GUI实例中查找这个属性,自然找不到。下面是几种可行的实现方式:
方式一:用lambda传递按钮实例给外部函数
如果外部函数只需要修改按钮本身的属性,可以把按钮对象作为参数传给函数,通过lambda包装调用逻辑:
import tkinter as tk # 外部函数:接收按钮对象作为参数 def changeButtonText(button): button.config(text="No", relief="sunken") class GUI: def __init__(self, root): self.root = root # 创建按钮时,用lambda把当前按钮实例传给外部函数 self.my_btn = tk.Button(root, text="Yes", command=lambda: changeButtonText(self.my_btn)) self.my_btn.pack() if __name__ == "__main__": root = tk.Tk() app = GUI(root) root.mainloop()
方式二:传递GUI实例给外部函数
如果外部函数需要访问GUI类里的其他属性,也可以把整个GUI实例传进去:
import tkinter as tk def changeButtonText(gui): gui.my_btn.config(text="No", relief="sunken") # 这里还可以操作GUI类的其他属性,比如gui.root做额外操作 class GUI: def __init__(self, root): self.root = root self.my_btn = tk.Button(root, text="Yes", command=lambda: changeButtonText(self)) self.my_btn.pack() if __name__ == "__main__": root = tk.Tk() app = GUI(root) root.mainloop()
方式三:将函数改为类的方法
如果这个函数只服务于GUI类,最简洁的方式是把它改成类的成员方法,这样直接用self.changeButtonText即可:
import tkinter as tk class GUI: def __init__(self, root): self.root = root self.my_btn = tk.Button(root, text="Yes", command=self.changeButtonText) self.my_btn.pack() # 改为类的方法 def changeButtonText(self): self.my_btn.config(text="No", relief="sunken") if __name__ == "__main__": root = tk.Tk() app = GUI(root) root.mainloop()
内容的提问来源于stack exchange,提问作者ranjit more
相关产品推荐
相关产品推荐

