Search code examples
python-3.xtkinteroptionmenu

Tkinter change which StringVar is tracing an OptionMenu after initialization


I can't figure out how, if it's even possible, to assign a different StringVar to an already existing OptionMenu

for example:

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
'''

Is this possible?


Solution

  • Yes it can but tricky.

    • First define a function as below:
      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)
      
    • Then call it whenever you want to change the variable:
      set_var(menu, bar)