【发布时间】:2019-09-24 07:29:56
【问题描述】:
我正在尝试使用 Python 和 Tkinter 制作一个 GUI 应用程序以与 Philips Hue API 一起使用。目前我有一个 python 对象的字典,其中正在循环为每个对象创建一个按钮,例如,按钮文本具有项目或灯光名称。
当我使用命令语句时出现问题。每个按钮都有命令函数,其中包含我希望在单击按钮时调用的函数。
按钮做得很好,其中包含正确的文本值,但是当我单击按钮并调用与对象有关的函数(在本例中称为 itemClick)时,问题就出现了,它传递了应该在最后一个按钮上,或在循环的末尾。
我尝试在按钮上使用“绑定”功能,但在这种情况下,按钮被点击的次数达到了循环通过的次数。
lightsButtonDict = {}
for item in lightlist:
print(lightlist[item].getName())
lightsButtonDict[lightlist[item].getName()] = tk.Button(lightsFrame, text=lightlist[item].getName(), command=lambda: itemClick(lightsFrame, 'light', lightlist[item]))
lightsButtonDict[lightlist[item].getName()].pack()
我在哪里声明command = lambda: itemClick(lightsFrame, 'light', lightslist[item])
点击按钮时最后一个lightlist[item]将被传递给函数,而不是循环中的那个,即如果有10个按钮,你点击第3个,第10个对象将被传递给itemClick(对不起如果这听起来有点混乱,希望它是可以理解的)
我想传入与当前循环相关的对象,因此如果单击第三个按钮,则传入第三个对象,依此类推。
TIA。
【问题讨论】:
-
command = lambda i = lightslist[item]: itemClick(lightsFrame, 'light', i)lambda 将在迭代中存储该项目,如果您将其分配给调用中的变量。 -
@tgikal 谢谢,这很好用。不确定如何将其设置为正确答案,您是否需要将其作为正确的回复而不是评论?
标签: python loops dictionary button tkinter