在字典上循环生成Tkinter按钮,在button cli上发出命令

2024-04-25 17:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python和Tkinter制作一个GUI应用程序来与philipshueapi一起工作。目前,我有一个python对象的字典,其中的一个正在循环,为每个对象创建一个按钮,例如按钮文本有item或light名称。你知道吗

当我使用command语句时,问题来了。每个按钮都有命令功能,其中包含我希望在单击按钮时调用的功能。你知道吗

按钮做得很好,里面有正确的文本值,但是当我单击按钮时,问题出现了,并且调用了关于对象的函数(在本例中称为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个按钮,并且您单击第3个按钮,第10个对象将被传递到itemClick中(抱歉,如果听起来有点混乱,希望可以理解)

我想传入与当前循环相关的对象,因此如果单击第3个按钮,则传入第3个对象,以此类推。你知道吗

蒂亚。你知道吗


Tags: 对象函数文本功能item次数按钮command
1条回答
网友
1楼 · 发布于 2024-04-25 17:27:29

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

相关问题 更多 >