Lambda函数:为什么我需要在事件处理程序中使用参数而不是在Button-commands中?

时间:2016-09-12 08:11:51

标签: python lambda

在以下Python lambda调用的情况下,我需要为函数设置一个参数才能正常工作:

name = Entry(self.new_jobtile, width=30)
...
name.bind('<Return>', lambda x:self.create_tile(name.get()))

但是,如果我使用Button,那么同样的lambda调用在没有&#34; x&#34;参数:

Button(self.new_jobtile, text="OK", command=lambda: self.create_tile(name.get()), width=4, height=2).pack(side=BOTTOM, pady=3, padx=5)

我真的不明白为什么?

2 个答案:

答案 0 :(得分:0)

在Python中,您可以创建不带参数的lambda函数:

bar = lambda : 4*2
bar() # 8

我不知道您使用的是哪个库,但我认为name.bind第二个参数应该是一个参数(如lambda x:def foo(x):),但在Button中构造函数参数command应该是0参数的函数(如lambda :def foo():)。

答案 1 :(得分:0)

我不知道EntryButton类的API,但这是我的猜测。 bind的{​​{1}}方法可能要求回调函数(你的lambda)有一个参数,换句话说,Entry方法中的某个地方可以是这样的一段代码:< / p>

bind

您只需忽略此参数,但您可以找出def bind(self, an_argument, yourcallback): yourcallback(something) 方法传递给回调的内容:

bind

另一方面,name.bind('<Return>', lambda x:self.create_tile(str(x) + " " + name.get())) 方法不传递参数。所以你的lambda就是这样的。