【问题标题】:Looping over a dictionary to make Tkinter buttons, issue with Command on button click循环遍历字典以制作 Tkinter 按钮,单击按钮时发出命令
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多