点击单个按钮调用多函数时self参数未被识别的问题排查
问题分析与解决
错误原因
你遇到的两个错误本质是同一个问题:
all_functions是一个类,function_1和function_2是实例方法,这类方法必须通过类的实例来调用——self参数代表的是类的实例对象,直接调用类的方法时没有实例传入,所以会提示缺少self参数。- 你直接写
all_functions.function_1(self)时,当前代码的全局作用域里根本没有定义self变量,self只有在类的实例方法内部才有意义,所以会报NameError。
解决方案
最直接的解决方式是先创建all_functions类的实例,然后通过实例调用这两个方法:
修改后的代码
import tkinter as tk class all_functions(): def function_1(self): self.a = 1 self.b = 2 print(self.a, self.b) def function_2(self): self.c = 3 self.d = 4 print(self.c, self.d) root = tk.Tk() # 创建类的实例 func_instance = all_functions() # 通过实例调用方法,lambda里的列表会依次执行两个方法 create_button = tk.Button(root, command=lambda:[func_instance.function_1(), func_instance.function_2()], text="Button") create_button.grid() root.mainloop()
其他可选方案(按需选择)
如果你的方法不需要使用实例属性(比如self.a这类变量),也可以把方法改成静态方法,这样就不需要实例化:
import tkinter as tk class all_functions(): @staticmethod def function_1(): a = 1 b = 2 print(a, b) @staticmethod def function_2(): c = 3 d = 4 print(c, d) root = tk.Tk() create_button = tk.Button(root, command=lambda:[all_functions.function_1(), all_functions.function_2()], text="Button") create_button.grid() root.mainloop()
注意:静态方法无法使用self,所以不能定义实例属性,适合不需要保存状态的简单函数。
内容的提问来源于stack exchange,提问作者Plantz
相关产品推荐
相关产品推荐

