Python Tkinter中lambda:与lambda event:区别及绑定报错原因
核心差异与报错原因
两种lambda写法的基础语法区别
lambda::定义零入参的匿名函数,调用时传入任何位置参数都会触发参数数量不匹配的报错。lambda event::定义接收1个位置参数的匿名函数,调用时需要传入1个参数,event只是通用的参数名约定,换成其他合法变量名效果完全一致。
报错的根本原因
报错来自Tkinter事件绑定的固定传参规则:
所有通过
.bind()方法绑定的事件回调,在事件触发时,Tkinter都会自动向回调传入1个Event实例,该实例存储了事件触发时的鼠标坐标、按键状态、触发源控件等上下文信息。
对应测试代码的两种写法:
- 按钮b1绑定的
lambda event: func(1)预留了1个形参位接收Tkinter传入的Event对象,哪怕函数内部没有使用这个参数,参数数量匹配,因此可以正常执行。 - 按钮b2绑定的
lambda: func(2)定义时明确声明不接收任何参数,事件触发时Tkinter按规则传入了1个Event参数,参数数量不匹配,就抛出了看到的TypeError:<lambda>() takes 0 positional arguments but 1 was given。
实用写法提示
如果不需要使用Event对象的内容,可以用Python惯例的下划线做参数占位,写成lambda _: func(2)即可正常运行,下划线表示“该参数会被接收但不会在函数内使用”。
注意不要和tk.Button构造时的command参数混淆:直接传入command的回调不会收到Tkinter自动传入的Event参数,这种场景下用lambda: func(xxx)是可以正常工作的,仅.bind()系列的事件绑定方法会给回调传Event参数。
内容的提问来源于stack exchange,提问作者user19221731
相关产品推荐
相关产品推荐

