Python:不明白为啥在 GUI“command=”中需要 lambda 来调用函数 [重复]
Posted
技术标签:
【中文标题】Python:不明白为啥在 GUI“command=”中需要 lambda 来调用函数 [重复]【英文标题】:Python: Not understanding why lambda is required in GUI "command=" to call function [duplicate]Python:不明白为什么在 GUI“command=”中需要 lambda 来调用函数 [重复] 【发布时间】:2018-10-11 01:55:34 【问题描述】:在学习Python的过程中。 我了解 lambda 的用法,这是一个示例和链接(供其他人使用)。
Why are Python lambdas useful?
mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])
将 [3, 6, 9] 分配给 mult3。
这是我在本书的测验中需要做的代码:
import tkinter
def counter(text):
"""Add 1 every time the button is pressed"""
count = int(text.get())
text.set(count + 1)
window = tkinter.Tk()
frame = tkinter.Frame(window)
frame.pack()
var = tkinter.IntVar()
var.set(0)
button = tkinter.Button(window, textvariable=var, command=lambda: counter(var))
button.pack()
tkinter.mainloop()
这是经过验证的解决方案。除了变量按钮中的代码外,我想出的是相同的。 这是我的台词:
button = tkinter.Button(window, textvariable=var, command=counter(var))
没有 lambda 会阻止计数器工作。我不明白为什么需要 lambda?因为我只是调用我创建的函数,所以我不需要新的未命名函数..?
提前感谢您的宝贵时间:)
【问题讨论】:
在您的代码版本中,counter(var)
只执行一次。在他们的版本中,每次单击按钮时都会执行。
你知道为什么吗?我正在努力理解
更广泛地考虑一下。当您传递像f(3 + 7)
这样的函数参数时,您并没有将3 + 7
传递给函数,而是传递了10
。
@Yabusa:“为什么”是什么意思?没有比语言如何工作更深层次的原因了。在一种情况下,Button 的参数是一个函数,在另一种情况下,它是函数调用的结果。
【参考方案1】:
这里发生了几件事。首先,当python编译command=counter(var)
时,它会调用该函数并将其结果分配给command
。你打电话给counter
,你的回调现在是None
,这显然不是你想要的。
您不能只使用command=counter
,这只会使counter
成为回调中使用的函数,因为API 无法为回调包含参数。所以你做
command=lambda:counter(var)
这会将一个不带参数的匿名函数分配给command
,就像 API 想要的那样。 lambda 在包含范围内包含对var
的引用,然后它使用它来调用counter
。这就是您为您真正想要的目标回调创建参数的方式。
这个引用有点奇怪。它是对包含范围内的var
插槽的引用,而不是在分配时恰好位于var
中的对象。如果在进行回调之前更改var
(或者包含范围消失,就像从函数返回时局部变量消失一样),则使用该新对象。所以,把你的代码放在一个函数中,这样你就不会发疯了!
【讨论】:
你也可以使用functools.partial在闭包中绑定var
。 tkinter.Button(window, textvariable=var, command=partial(counter, var))
以上是关于Python:不明白为啥在 GUI“command=”中需要 lambda 来调用函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥其他窗口(GUI)没有打开,而其他窗口(GUI)在 Python 中运行?
我不明白为啥 Python 在此脚本中引发错误“TypeError: bad operand type for unary -: 'list''