Changing the options of a OptionMenu when clicking a Button
I modified your script to demonstrate how to do this:
import Tkinter as tkroot = tk.Tk()choices = ('network one', 'network two', 'network three')var = tk.StringVar(root)def refresh(): # Reset var and delete all old options var.set('') network_select['menu'].delete(0, 'end') # Insert list of new options (tk._setit hooks them up to var) new_choices = ('one', 'two', 'three') for choice in new_choices: network_select['menu'].add_command(label=choice, command=tk._setit(var, choice))network_select = tk.OptionMenu(root, var, *choices)network_select.grid()# I made this quick refresh button to demonstratetk.Button(root, text='Refresh', command=refresh).grid()root.mainloop()
As soon as you click the "Refresh" button, the options in network_select are cleared and the ones in new_choices are inserted.
The same, but with tk.Menu
widget:
# Using lambda keyword and refresh function to create a dynamic menu.import tkinter as tkdef show(x): """ Show menu items """ var.set(x)def refresh(l): """ Refresh menu contents """ var.set('') menu.delete(0, 'end') for i in l: menu.add_command(label=i, command=lambda x=i: show(x))root = tk.Tk()menubar = tk.Menu(root)root.configure(menu=menubar)menu = tk.Menu(menubar, tearoff=False)menubar.add_cascade(label='Choice', menu=menu)var = tk.StringVar()l = ['one', 'two', 'three']refresh(l)l = ['four', 'five', 'six', 'seven']tk.Button(root, text='Refresh', command=lambda: refresh(l)).pack()tk.Label(root, textvariable=var).pack()root.mainloop()
In case of using ttk, there is a convenient set_menu(default=None, values)
method on the OptionMenu object.