Tkinter Designer

← Guías de tkinter

¿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 actual

Pueden 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 →

Preguntas relacionadas