Lambda函数在tkinter按钮回调中



我非常了解lambda函数。话虽如此,我有一个Python tkinter GUI,它打开了一个单独的"选项"窗口——用户输入文本,然后可以单击";设置";按钮,或按绑定到同一按钮的回车键,设置文本并返回主窗口。

enter键的绑定代码似乎需要我告诉lambda函数我正在传递输入(据我所知,这就是它们的工作方式,也是我所期望的(。

然而,按钮的"command="代码只有在我不包含它的情况下才有效,我不理解。

这是代码——我的问题是——为什么在按钮的情况下,我不告诉lambda函数我正在将变量传递到函数中,而在回车键绑定中,我会这样做?

saveBtn = tk.Button(saveWindow,text='Save', width=10,**command=lambda: pressed(fName)**)
saveBtn.grid(row=2,column=2)        
saveWindow.bind('<Return>',**lambda x: pressed(fName)**)

似乎回车键的绑定代码需要我告诉lambda函数我正在传递输入(据我所知,这就是它们的工作方式,也是我所期望的(。

不完全是。bind命令要求向它传递一个可调用函数,并且该可调用函数必须接受一个位置参数才能接收事件对象。bind命令不关心可调用对象是函数、lambda还是其他任何对象。它必须是可调用的并接受一个参数。

如果需要传入其他参数,则需要定义一个负责参数处理的可调用函数。最常见的方法是使用lambdafunctools.partial,它们允许您创建一个新的匿名可调用函数。

。。。为什么在按钮的情况下,我不告诉lambda函数我正在将变量传递到函数中,而在回车键绑定中,我会这样做?

简短的回答是:;这就是它们被定义为工作的方式;。按钮的command将在没有任何参数的情况下被调用,bind调用的函数将被传递一个表示事件的参数。

我想这是因为通常按钮的命令不需要事件参数,因为事件在很大程度上是不相关的。另一方面,绑定函数通常需要事件参数。

最新更新