OptionMenu теряет команду при обновлении

При обновлении моего 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?


person Makori SM    schedule 28.06.2018    source источник


Ответы (1)


Команда, которую вы даете 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))
person fhdrsdg    schedule 28.06.2018
comment
В нем говорится, что '_setit' is not defined когда я ссылаюсь на него в любом месте кода (также код, который я впервые опубликовал, был полностью внутри функции на случай, если это имеет значение) - person Makori SM; 28.06.2018
comment
Это просто класс tkinter, такой же, как OptionMenu. Как вы импортировали tkinter? Из ClientMenu = OptionMenu(...) я догадался, что вы сделали from tkinter import *. - person fhdrsdg; 28.06.2018
comment
да from tkinter import * был тем, что я использовал - person Makori SM; 28.06.2018
comment
О, я понимаю, подчеркнутые классы не импортируются с помощью импорта подстановочных знаков, см. PEP8. Добавьте from tkinter import _setit. (Или вообще перестаньте использовать импорт с подстановочными знаками и используйте import tkinter as tk. Затем вы можете использовать tk._setit().) - person fhdrsdg; 28.06.2018
comment
СПАСИБО, вы спасли мне жизнь. У меня ничего не получалось, и без вашей помощи я бы никогда не понял это. (новичок в питоне) - person Makori SM; 28.06.2018