为什么Tkinter绑定<Key>事件调用方法需要用到lambda函数?
问题原因分析
Tkinter的bind方法要求第二个参数传入可调用的函数/方法对象,当绑定的事件触发时,Tkinter会自动调用这个传入的对象,同时将事件对象作为参数传给它。
两种写法的本质区别:
- 写法1:
self.reader.bind("<Key>", lambda event: self.update_labels())
这里传入的是lambda匿名函数对象,程序运行到这行时只会把函数对象注册为事件回调,不会立即执行。等到<Key>事件触发时,Tkinter才会调用这个lambda函数,进而执行内部的update_labels()方法,功能自然正常。 - 写法2:
self.reader.bind("<Key>", self.update_labels())
这里self.update_labels()带了括号,Python运行到这行代码时会立即执行一次update_labels方法,并将方法的返回值(你的update_labels没有写return语句,默认返回None)传给bind方法。等于你给事件绑定的回调是None,后续事件触发时没有可执行的逻辑,功能自然失效。
如果不想用lambda,也可以直接写self.reader.bind("<Key>", self.update_labels),不带括号直接传入方法对象即可。你的update_labels方法定义了*args参数,可以正常接收Tkinter传入的事件对象,不需要额外封装lambda也能正常运行。
内容的提问来源于stack exchange,提问作者pippo1980
相关产品推荐
相关产品推荐

