python - Python:不明白为什么在 GUI“command=”中需要 lambda 来调用函数
问题描述
在学习Python的过程中。我了解 lambda 的使用,这是一个示例和链接(供其他人使用)。
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?因为我只是调用我创建的函数,所以我不需要新的未命名函数..?
在此先感谢您的时间 :)
解决方案
这里发生了几件事。首先,当 python 编译command=counter(var)
时,它会调用函数并将其结果分配给command
. 你打电话counter
了,你的回电现在是None
,这显然不是你想要的。
您不能只做command=counter
简单地使counter
函数在回调中使用的操作,因为 API 没有办法为回调包含参数。所以你也是
command=lambda:counter(var)
这会分配一个不带参数的匿名函数,command
就像 API 想要的那样。lambdavar
在包含范围内包含对它的引用,然后用于调用counter
. 这就是您为真正想要的目标回调创建参数的方式。
这个参考有点奇怪。它是对包含范围内的插槽的引用,而不是在分配时var
碰巧在其中的对象。var
如果var
在进行回调之前进行更改(或者包含范围消失,就像函数返回时局部变量消失一样),则使用该新对象。所以,把你的代码放在一个函数中,这样你就不会让自己发疯!
推荐阅读
- python - 在某个值之后在numpy数组中插入元素
- reactjs - 与 ts 反应 - 检查地图 view.tsx 中的道具是否为空
- typescript - 我们如何获取对象的键?
- reactjs - 如何使用 React Native 在 Android 上添加 Maven 构建依赖项?
- ag-grid - 拖动到另一个网格时如何复制一行?
- java - Java 8 中的 PriorityBlockingDeque?
- javascript - 如何在多行中显示嵌套标签?
- reactjs - react-native-flatlist-slider 中的 scrollToIndex 超出范围
- css - Github markdown equations 改变 textcolor
- c++ - Stringizing operator # 不能处理一个双引号的情况