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在闭包中绑定vartkinter.Button(window, textvariable=var, command=partial(counter, var))

以上是关于Python:不明白为啥在 GUI“command=”中需要 lambda 来调用函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥其他窗口(GUI)没有打开,而其他窗口(GUI)在 Python 中运行?

Python:GUI之tkinter学习笔记3事件绑定

我不明白为啥 Python 在此脚本中引发错误“TypeError: bad operand type for unary -: 'list''

不明白为啥拆包没有按预期工作

python gui编程,我是初学者。用tk,制作下拉菜单的command不分我想打开另一个界面。如和解决,求解!!

python桌面开发,为啥选择PyQt或wxPython,而不使用Tkinter?