python - 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)**)
解决方案
似乎 enter 键的绑定代码需要我告诉 lambda 函数我正在传递输入(据我所知,这就是它们的工作方式,这就是我所期望的)。
不完全的。该bind
命令要求您向其传递一个callable,并且该 callable 必须接受一个位置参数才能接收事件对象。该bind
命令不关心可调用对象是函数、alambda
还是其他任何东西。它必须是可调用的并接受一个参数。
如果您需要传入其他参数,则需要定义一个负责处理参数的可调用对象。最常见的方法是使用lambda
或functools.partial
创建一个新的匿名可调用函数。
...为什么在按钮情况下我没有告诉 lambda 函数我将变量传递给函数,但在输入键绑定中我这样做了?
简短的回答很简单,“这就是它们的工作方式”。按钮command
将在没有任何参数的情况下被调用,并且被调用的函数bind
将被传递一个表示事件的参数。
我想这样做的原因是通常按钮的命令不需要事件参数,因为事件在很大程度上是不相关的。另一方面,绑定函数通常需要事件参数。
推荐阅读
- javascript - 仅当文本字段不为空时才执行循环
- xaml - WebView EvaluateJavaScriptAsync 在 ios 上失败
- flutter - 为什么我无法将 fluttertoast 包导入我的项目
- powerbi - 如何显示当前学年?
- java - 来自相机的 Gstreamer Java udp 流未在 JavaFX 中显示
- javascript - Antd Select 在移动设备上不起作用
- qt - 当我关闭弹出窗口然后单击手机上的后退按钮时,我的应用程序会在 qml 中关闭
- python - (Python) 凯撒密码未运行
- sql - 如何在不使用 WHEN 的情况下在 SQL Oracle 中获得彩色输出
- spring-boot - 使用 FeignClient 为 MultipartFile 接收器 API 上传 MultiValueMap 时出现问题