遍历字典以制作Tkinter按钮,并在单击按钮时发出Command

时间:2019-05-06 16:19:54

标签: python loops dictionary button tkinter

我正在尝试使一个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。

1 个答案:

答案 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()