首页 > 解决方案 > tkinter 按钮回调中的 Lambda 函数

问题描述

我非常了解 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)**)

标签: pythontkinterbuttonlambdacommand

解决方案


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

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

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

...为什么在按钮情况下我没有告诉 lambda 函数我将变量传递给函数,但在输入键绑定中我这样做了?

简短的回答很简单,“这就是它们的工作方式”。按钮command将在没有任何参数的情况下被调用,并且被调用的函数bind将被传递一个表示事件的参数。

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


推荐阅读