Изменение Tkinter, которое StringVar отслеживает OptionMenu после инициализации

Я не могу понять, как, если это вообще возможно, назначить другую StringVar уже существующему OptionMenu

Например:

def optionMenuChanged(*args):
    print(args[0]) # prints var1 if assigned to foo, prints var2 if assigned to bar
foo = tk.StringVar(name = 'var1')
foo.trace('w', optionMenuChanged)
bar = tk.StringVar(name = 'var2')
bar.trace('w', optionMenuChanged)
choices = ['1', '2', '3']
menu = OptionMenu(frame, foo, *choices)
'''
do stuff with menu
'''
menu.SetVariable(bar) # SetVariable does not exist
'''
do other stuff with menu
'''

Это возможно?


person Benjamin Norton    schedule 17.08.2020    source источник
comment
Вы ищете что-то подобное? stackoverflow.com/q/33132486/13629335   -  person Atlas435    schedule 17.08.2020


Ответы (1)


Да можно, но сложно.

  • Сначала определите функцию, как показано ниже:
    def set_var(optmenu, var, callback=None):
        menu = optmenu['menu']
        last = menu.index('end')
        for i in range(last+1):
            label = menu.entrycget(i, 'label')
            menu.entryconfig(i, command=tk._setit(var, label, callback))
        optmenu.config(textvariable=var)
    
  • Затем вызывайте его всякий раз, когда вы хотите изменить переменную:
    set_var(menu, bar)
    
person acw1668    schedule 18.08.2020