如何防止 Tkinter 在绑定中传递事件对象?有什么解决方法可以做到这一点吗?

Tob*_*ski 1 events tkinter event-binding python-2.7

我想使用 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()
Run Code Online (Sandbox Code Playgroud)

这里,回调中的参数事件是不必要的。是否有任何解决方案或解决方法可以防止绑定方法传递事件对象?

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

def callback2():
    print 'clicked!'
Run Code Online (Sandbox Code Playgroud)

在绑定中?就像是:

frame.bind('<Button-2>', callback2)
Run Code Online (Sandbox Code Playgroud)

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

jon*_*rpe 6

在我看来,你有三个广泛的选择(按照复杂性递增的顺序):

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

    def callback2(_):
        ...  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 绑定回调时将其包装起来:

    frame.bind('...', lambda event: callback2())
    
    Run Code Online (Sandbox Code Playgroud)
  3. event编写一个装饰器来为您忽略该参数:

    def no_event(func):
        @functools.wraps(func)
        def wrapper(event):
            return func()
        return wrapper
    
    Run Code Online (Sandbox Code Playgroud)

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

    @no_event
    def callback2():
        ...
    
    Run Code Online (Sandbox Code Playgroud)