Tkinter类绑定按钮调用外部函数时报错name 'self'未定义如何解决
问题成因
self是Python类实例方法的专属局部参数,仅在类的实例方法内部作用域生效,你在类外定义的全局函数lbl的作用域内不存在self变量,直接调用自然会抛出未定义错误。- 你在
login类定义下写的global self完全无效,self不是全局变量,无法通过global关键字声明为全局可访问。
修复方案
这里提供两种常用可行的修复方式:
方式1:将lbl改为类的实例方法(最推荐)
直接把lbl挪到login类内部定义为实例方法,天然可以访问实例本身的self:
class login(Frame): def __init__(self,parent,controller): Frame.__init__(self,parent) # command绑定类内部的lbl方法即可 btn=Button(self,text='view',command=self.lbl).place(x=40,y=40) # 定义为实例方法,第一个参数固定为self def lbl(self): lbl1=Label(self,text='hello',fg='red').place(x=10,y=10)
方式2:用lambda传参给全局lbl函数
如果要保留lbl为全局函数,可以修改函数接收父组件参数,按钮绑定的时候用lambda把当前类的self传进去:
# 修改lbl函数,接收parent参数替代原来的self def lbl(parent): lbl1=Label(parent,text='hello',fg='red').place(x=10,y=10) class login(Frame): def __init__(self,parent,controller): Frame.__init__(self,parent) # 用lambda包装一层,把当前实例self作为参数传给lbl btn=Button(self,text='view',command=lambda: lbl(self)).place(x=40,y=40)
内容的提问来源于stack exchange,提问作者Learn python
相关产品推荐
相关产品推荐

