【发布时间】:2021-08-27 09:34:32
【问题描述】:
我非常了解 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)**)
【问题讨论】:
-
当 tkinter 调用你的
command时,你已经知道用户按下了按钮。但是如果你绑定到类似"<Key>"的东西,你可能想知道按下了哪个键,所以当tkinter调用你的函数时,它会使用event参数调用它。尝试打印出来自己看看 -
tkinter 的作者决定该按钮将在没有任何参数的情况下运行
function()。他们决定bind将运行function(event)并提供额外信息。在其他 GUI 框架中 - 例如PyQt、PYGTK- 它可能会以不同的方式工作,并且按钮也可能会发送一些额外的信息来运行。 -
@furas: “tkinter 的作者决定按钮将在没有任何参数的情况下运行 function()。” 并不完全正确。绑定需要一个callable,并且python 的规则不允许你指定一个callable,除非你使用
lambda或functools.partial之类的东西。这不是真正的 tkinter 东西,而是 python 的东西。 -
@BryanOakley 我并没有考虑如何创建可调用对象,但我在想
mainloop将如何执行分配的功能 - 这是 tkinter(或tcl/tk)的作者决定mainloop为command=将在不带参数的情况下运行此函数,但bind使用event运行。
标签: python tkinter button lambda command