使用.bind时如何传递参数?

时间:2017-06-05 17:40:27

标签: python-2.7 tkinter parameter-passing

我正在尝试将单独的函数绑定到左键和右键单击按钮。 不幸的是,当按下按钮时,python会给我这个错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1542, in __call__
    return self.func(*args)
TypeError: () takes no arguments (1 given)

我认为这与Tkinter在调用函数时传递事件信息有关。

这是代码(我缩短了一点并删除了不必要的东西):

class Minefield():
    def __init__(self, X,Y,Parent,Array):
        self.Button = Tk.Button(Parent)
        self.Button.bind('<Button-1>',lambda: Array.Trigger(self.state,self.cordX,self.cordY) )  # NOTE: Array Function Trigger
        self.Button.bind('<Button-3>',lambda: self.setState(self.state,1)) 
class Array():
    def __init__(self):
        self.Array=[]
    def Trigger(self,X,Y):
        print "Trigger at", X, Y
        do_nothing()

现在我的问题:

有效传递哪些参数以及如何在一个无意使用参数中定义的其他东西的函数中处理它们?

1 个答案:

答案 0 :(得分:2)

将函数绑定到事件时,tkinter将始终将一个参数传递给该函数。此参数是一个对象,其中包含有关事件的信息,例如接收事件的窗口小部件,导致事件的键或鼠标等。

如果您正在调用不需要参数的函数,请忽略它。如果您还需要在事件上下文之外使用该函数,请为其指定默认值None

如果要将其他参数传递给回调,则需要在lambda中考虑event参数。你不必使用它,但你的lambda需要接受它。例如:

self.Button.bind('<Button-3>', lambda event: self.setState(self.state,1))