Tkinter类方法self未定义问题及成员前缀移除疑问求助
问题解决与答疑
1. NameError 报错的修复方案
你的change_channel作为类的实例方法,参数定义和内部调用存在两处问题:
- Tkinter绑定事件时,会自动把事件对象作为参数传给回调方法,所以实例方法的第一个参数必须是
self(代表类实例本身),后续再接收事件参数。 - 你之前的两种尝试都没命中核心:
- 直接去掉
self.lbox里的self:lbox会变成__init__方法的局部变量,change_channel根本找不到它 - 只把参数改成
(self):Tkinter传递事件对象时会因参数数量不匹配报错
- 直接去掉
修正后的change_channel方法可以写成两种形式:
def change_channel(self, *args): idxs = self.lbox.curselection() idx = int(idxs[0]) global channel_ini channel_ini = idx url = liste_url[idx] media = instance.media_new(url) player.set_media(media) player.play()
或者明确接收事件参数:
def change_channel(self, event): idxs = self.lbox.curselection() idx = int(idxs[0]) global channel_ini channel_ini = idx url = liste_url[idx] media = instance.media_new(url) player.set_media(media) player.play()
2. 能否移除所有成员声明的self前缀?
绝对不行。
在Python类的规则里:
- 不带
self的变量是局部变量,仅在定义它的方法内部有效,其他实例方法(比如change_channel)完全访问不到 - 加
self前缀的才是实例变量,绑定在类的实例上,所有实例方法都能通过self访问到它
比如你在__init__里写self.lbox = ...,这个lbox才是属于当前窗口实例的控件;如果写成lbox = ...,这个变量会在__init__执行完毕后被销毁,change_channel根本找不到对应的列表框控件。
内容的提问来源于stack exchange,提问作者Pierre Lemerle
相关产品推荐
相关产品推荐

