Say I have an option menu network_select that has a list of networks to connect to.
import Tkinter as tk
choices = ('network one', 'network two', 'network three')
var = tk.StringVar(root)
network_select = tk.OptionMenu(root, var, *choices)
Now, when the user presses the refresh button, I want to update the list of networks that the user can connect to.
- I don’t I can use
.configbecause I looked throughnetwork_select.config()and didn’t see an entry that looked like the choices I gave it. - I don’t think this is something one can change using a tk variable, because there is no such thing as a
ListVar.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
I modified your script to demonstrate how to do this:
import Tkinter as tk
root = 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 demonstrate
tk.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.
Method 2
The same, but with tk.Menu widget:
# Using lambda keyword and refresh function to create a dynamic menu.
import tkinter as tk
def 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()
Method 3
In case of using ttk, there is a convenient set_menu(default=None, values) method on the OptionMenu object.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0