Цикл по словарю, чтобы сделать кнопки Tkinter, проблема с командой при нажатии кнопки - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь создать приложение с графическим интерфейсом для работы с API оттенков Philips, используя Python и Tkinter.В настоящее время у меня есть словарь объектов 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])

для кнопкищелчок по последнему списку источников света [элемент] будет передан в функцию, а не тот, что в цикле, т. е. если есть 10 кнопок и вы нажмете 3-ю, 10-й объект будет передан в itemClick (извините, если это звучит немногоперемешался, надеюсь, это понятно)

Я бы хотел передать объект, который связан с этим текущим циклом, поэтому, если нажать на 3-ю кнопку,передается третий объект и т. д.

TIA.

1 Ответ

0 голосов
/ 07 мая 2019

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...