如何防止 Tkinter 在绑定中传递事件对象?有什么解决方法吗?

How can I prevent Tkinter from passing the event object in a binding? Is there any workaround to do this?

我想使用 Tkinter 将方法绑定到事件,但我不需要 'bind' 方法传递的事件对象。 为清楚起见,一些代码:

from Tkinter import *

root = Tk()

def callback(event):
    print 'clicked!'

frame = Frame(root, width=100, height=100)
frame.bind('<Button-1>', callback)
frame.pack()

root.mainloop()

这里callback中的参数event是不需要的。是否有任何解决方案或解决方法来防止绑定方法传递事件对象?

我的意思是,我可以这样称呼吗:

def callback2():
    print 'clicked!'

绑定?类似于:

frame.bind('<Button-2>', callback2)

(这实际上不起作用,因为 bin 传递了事件,但 callback2 没有参数)。

如我所见(按照复杂性递增的顺序),您有三个广泛的选择:

  1. 使用约定忽略的变量名_:

    def callback2(_):
        ...  
    
  2. 绑定时包装回调:

    frame.bind('...', lambda event: callback2())
    
  3. 写个装饰器给你忽略event参数:

    def no_event(func):
        @functools.wraps(func)
        def wrapper(event):
            return func()
        return wrapper
    

    然后将其应用于不需要该事件的回调方法:

    @no_event
    def callback2():
        ...