OptionMenu теряет команду при обновлении - PullRequest
0 голосов
/ 28 июня 2018

При обновлении моего tkinter OptionMenu называется ClientMenu примерно так:

    for i in range(0, len(Clientlist)-1):
    client1d.append(Clientlist[i][0])
ClientMenu.children["menu"].delete(0,len(Clientlist))

for i in range(0, len(Clientlist)):
    nm = Clientlist[i][0]
    client1d.append(nm)
    ClientMenu.children["menu"].add_command(label = nm)

ClientMenu.children["menu"].add_command(label="Add new Client+")

Это удаляет все записи в списке, а затем проходит через 1d массив, содержащий все опции, которые идут в меню. Это прекрасно работает и правильно добавляет все опции в меню.

Однако первоначальная команда, которая была в ClientMenu, когда она была впервые определена

ClientMenu = OptionMenu(screen, dropdown, *client1d,"Add new Client+", command = dropdowncheck)

команда dropdowncheck не запускается при воссоздании меню, однако выполняется до того, как все будет удалено и добавлено заново. Есть ли способ добавить обратно параметры, а также добавить команду «dropdowncheck» в OptionMenu

1 Ответ

0 голосов
/ 28 июня 2018

Команда, которую вы даете OptionMenu, автоматически передается всем add_command методам в меню, созданном в тот момент. В __init__ в OptionMenu вы можете увидеть это как

menu.add_command(label=v,
                 command=_setit(variable, v, callback))

Поскольку ваши add_command функции не передают никаких команд, щелчок по этим параметрам ничего не вызывает.
В приведенном выше коде _setit описывается как

class _setit:
    """Internal class. It wraps the command in the widget OptionMenu."""

Обычно этот класс выполняет две вещи при вызове:

  1. Установить переменную в новое значение
  2. Вызвать команду с новым значением в качестве аргумента

Вы можете воссоздать это поведение в функции, которую вы пишете сами, но проще всего было бы просто повторно использовать этот класс, например:

ClientMenu.children["menu"].add_command(label = nm
                                        command =_setit(dropdown, nm, dropdowncheck))
...