¿Cómo obtengo el valor seleccionado de un Combobox en tkinter?
El Combobox es un widget de ttk, y .get() sobre el propio widget devuelve el texto actual: no hace falta ninguna variable, aunque sigue ayudando cuando varios sitios necesitan el mismo valor.
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
colour = ttk.Combobox(root, values=["red", "green", "blue"], state="readonly")
colour.current(0) # mostrar la primera opción
colour.pack()
def go():
print("eligió", colour.get())
tk.Button(root, text="Continuar", command=go).pack()
root.mainloop() Por qué aparece vacío
Pasar values llena la lista desplegable pero no selecciona nada, así que el cuadro aparece en blanco y .get() devuelve una cadena vacía hasta que alguien elige. Pon tú la opción inicial con .current(0) para la primera o con .set("green") para una en concreto.
colour.current(0) # por posición
colour.set("green") # por valor
colour.current() # -> el índice del valor actualPueden escribir lo que quieran si no lo impides
Un Combobox es editable por defecto: su state es normal, así que el usuario puede ignorar tu lista y escribir su propio texto, que .get() te devolverá tal cual. Poner state="readonly" deja usable el desplegable pero impide modificar el texto, y es lo correcto cuando el conjunto de opciones es fijo.
Déjalo editable solo cuando el texto libre esté realmente permitido, y valida lo que llega: un Combobox siempre devuelve una cadena, tenga la lista la pinta que tenga.
colour = ttk.Combobox(root, values=[...], state="readonly")Reaccionar cuando eligen
El widget lanza <<ComboboxSelected>> cuando se elige algo de la lista. Enlaza ese evento en lugar de consultar en bucle, y lee el valor dentro del manejador, que recibe el argumento event de siempre.
def on_pick(event):
print("ahora", colour.get())
colour.bind("<<ComboboxSelected>>", on_pick)Cambiar las opciones después
La lista es una opción normal del widget, así que asignarle otra cosa reemplaza las opciones en cualquier momento. Hacerlo no borra el texto actual, y puede quedar en pantalla un valor que ya no está en la lista: bórralo tú cuando eso importe.
colour["values"] = ["cyan", "magenta"]
colour.set("") # limpiar una selección que ya no vale Hacerlo sin buscarlo
Escribe las opciones una por línea en el inspector y la exportación construye el ttk.Combobox con ellas. Marca "Expose a variable" para tener además un StringVar, y elige <<ComboboxSelected>> en la lista de eventos para que te escriba el stub del manejador.
Diseña la ventana visualmente y ve el código Python generado sobre la marcha.
Abrir el diseñador de tkinter →