¿Cómo uso un OptionMenu en tkinter?
Un OptionMenu se construye alrededor de una variable en lugar de devolver un valor propio. Le pasas la variable, después las opciones, y la elección se lee de esa misma variable.
import tkinter as tk
root = tk.Tk()
choice = tk.StringVar(value="medium") # también es la etiqueta del botón
tk.OptionMenu(root, choice, "small", "medium", "large").pack()
def go():
print("eligió", choice.get())
tk.Button(root, text="Continuar", command=go).pack()
root.mainloop() Por qué el botón aparece en blanco
El botón muestra lo que tenga la variable, y un StringVar recién creado tiene la cadena vacía, así que un OptionMenu con una variable pelada es un botón en blanco hasta que alguien lo abre y elige. Dale un valor inicial a la variable y de paso queda como opción por defecto.
choice = tk.StringVar(value="medium") # no tk.StringVar()Cambiar las opciones en tiempo de ejecución
Las opciones se fijan al construirlo, así que no hay una opción values que reasignar como en el Combobox. Lo que sí puedes hacer es llegar al menú que hay debajo, vaciarlo y agregar entradas nuevas, cada una poniendo la variable cuando se elige.
Funciona, pero es lo bastante incómodo como para que un ttk.Combobox suela ser mejor widget cuando la lista cambia: allí reemplazar las opciones es una sola asignación.
menu = option_menu["menu"]
menu.delete(0, "end")
for opt in ("alpha", "beta"):
menu.add_command(label=opt, command=lambda o=opt: choice.set(o))Reaccionar a la elección
En lugar de un command en el widget, ponle un trace a la variable: se dispara cada vez que el valor cambia, incluso cuando lo cambia tu propio código. La función recibe de Tk tres argumentos posicionales que normalmente puedes ignorar.
def on_change(*_):
print("ahora", choice.get())
choice.trace_add("write", on_change) Hacerlo sin buscarlo
Escribe las opciones una por línea y la exportación escribe por ti el StringVar, el OptionMenu y el valor por defecto. Si esperas que la lista cambie mientras la aplicación corre, elige un Combobox en el diseñador: el mismo campo del inspector alimenta a los dos.
Diseña la ventana visualmente y ve el código Python generado sobre la marcha.
Abrir el diseñador de tkinter →