我正在尝试使一个GUI应用程序与使用Python和Tkinter的Philips hue API一起使用。目前,我有一个python对象字典,该字典正在循环播放以为每个对象创建一个按钮,例如,按钮文本具有项目或名称。
当我使用命令语句时出现问题。每个按钮都有命令功能,其中包含我想在单击按钮时调用的功能。
按钮做得很好,其中包含正确的文本值,但是当我单击按钮时,问题就出现了,并且有关对象的函数被调用(在这种情况下称为itemClick),它传递了应该在最后一个按钮上,或在循环结束时。
我尝试在按钮上使用'bind'功能,但是在这种情况下,单击按钮的次数是循环所经历的时间。
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个按钮,然后单击第三个按钮,则第10个对象将被传递到itemClick中(抱歉如果听起来有些混乱,希望可以理解)
我想传递与当前循环相关的对象,因此,如果单击第三个按钮,则传递第三个对象,依此类推。
TIA。
答案 0 :(得分:0)
lambda
将在迭代中存储该项目,如果您将其分配给调用中的变量:
lightsButtonDict = {}
for item in lightlist:
print(lightlist[item].getName())
lightsButtonDict[lightlist[item].getName()] = tk.Button(lightsFrame,
text=lightlist[item].getName(),
command = lambda i = lightslist[item]: itemClick(lightsFrame, 'light', i).pack()