Listas desplegables y listas de selección en Tkinter
En este artículo exploramos Listbox y ttk.Combobox, sus modos de selección, cómo cargar datos de forma dinámica y cuándo elegir cada widget.
1. Listbox: selección simple y múltiple
El widget Listbox pertenece al módulo básico de Tkinter y permite presentar una lista vertical de ítems. Es ideal cuando el usuario necesita ver varias opciones a la vez o seleccionar varias entradas.
1.1. Modos de selección
SINGLE– Sólo un elemento puede estar seleccionado.BROWSE– Similar aSINGLEpero permite mover la selección con el ratón arrastrado.MULTIPLE– Cada clic alterna el estado del ítem (seleccionado/no seleccionado).EXTENDED– Permite seleccionar rangos con Shift y agregar con Ctrl (el modo más usado para selecciones múltiples).
1.2. Propiedades y métodos clave
listbox = tk.Listbox(root, selectmode=tk.EXTENDED, height=8, width=30)
listbox.pack(padx=10, pady=5)
# Insertar ítems
for item in items:
listbox.insert(tk.END, item)
# Obtener selección
selected = [listbox.get(i) for i in listbox.curselection()]
1.3. Carga dinámica de datos
En aplicaciones reales los ítems provienen de bases de datos, archivos CSV o APIs. A continuación, un ejemplo que carga una lista de cursos desde un archivo JSON.
import json, tkinter as tk
with open('cursos.json') as f:
data = json.load(f) # [{"id":1,"nombre":"Matemáticas"}, ...]
root = tk.Tk()
listbox = tk.Listbox(root, selectmode=tk.EXTENDED, height=10)
listbox.pack(fill='both', expand=True)
for curso in data:
listbox.insert(tk.END, f"{curso['id']}: {curso['nombre']}")
root.mainloop()
2. ttk.Combobox: selección de una única opción
El widget ttk.Combobox pertenece al paquete temático ttk y combina la funcionalidad de una lista desplegable con la de un campo de texto editable. Por defecto, sólo permite seleccionar un ítem, lo que lo hace perfecto para formularios que requieren una única elección.
2.1. Creación básica
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
values = ["Ingeniería", "Derecho", "Medicina", "Arquitectura"]
combo = ttk.Combobox(root, values=values, state="readonly") # "readonly" evita edición libre
combo.current(0) # Selecciona el primer elemento por defecto
combo.pack(padx=10, pady=5)
root.mainloop()
2.2. Carga dinámica (p.ej., materias desde una API)
import tkinter as tk
from tkinter import ttk
import requests
def cargar_materias():
resp = requests.get('https://api.ejemplo.com/materias')
resp.raise_for_status()
return [m['nombre'] for m in resp.json()]
root = tk.Tk()
combo = ttk.Combobox(root, state='readonly')
combo['values'] = cargar_materias()
combo.pack(padx=10, pady=5)
root.mainloop()
2.3. Eventos útiles
<– Se dispara cuando el usuario elige una opción.> validateyvalidatecommand– Permiten validar la entrada cuandostate='normal'.
def on_select(event):
print('Seleccionado:', combo.get())
combo.bind('<>', on_select)
3. Comparativa rápida (Listbox vs ttk.Combobox)
Listbox
- Visualiza varias opciones simultáneamente.
- Soporta selección múltiple (EXTENDED, MULTIPLE).
- Ideal para listas largas o cuando el usuario necesita comparar ítems.
- Requiere más espacio vertical.
- Sin soporte nativo para autocompletar.
ttk.Combobox
- Oculta la lista hasta que el usuario haga click.
- Selección única por defecto.
- Ahorra espacio en la UI.
- Puede configurarse como editable (autocompletar manual).
- No muestra múltiples ítems a la vez, por lo que no es ideal para comparaciones.
4. Buenas prácticas y troubleshooting
4.1. Rendimiento con listas muy extensas
Cuando la lista supera varios miles de ítems, Listbox puede volverse lento al insertar. Utiliza listbox.configure(exportselection=False) y agrupa inserciones dentro de listbox.batch() (disponible en tkinter 8.6.9+).
4.2. Seguridad de datos externos
Si los valores provienen de una API pública, valida siempre el contenido antes de insertarlo para evitar inyección de código o caracteres no imprimibles que puedan romper la UI.
4.3. Compatibilidad y escalabilidad
- Ambos widgets funcionan en Windows, macOS y Linux con la misma API.
- En entornos de alta DPI, usa
tk.call('tk', 'scaling', 1.5)para mantener la legibilidad. - Para aplicaciones que requieren temas personalizados, prefiera
ttk.Comboboxya que sigue el tema activo del sistema.
5. Ejercicio propuesto para el alumno
Desarrolla una pequeña aplicación de gestión de inscripción a cursos que cumpla los siguientes requisitos:
- Al iniciar, la aplicación debe cargar una lista de carreras desde un archivo
carreras.jsony mostrarlas en unttk.Combobox(selección única). - Al seleccionar una carrera, la aplicación debe leer un segundo archivo
cursos_{carrera}.jsony poblar unListboxcon los cursos disponibles, permitiendo selección múltiple (EXTENDED). - Incluye un botón “Inscribir” que, al pulsarse, escribe en
inscripciones.txtel nombre de la carrera y los cursos seleccionados, con marca de tiempo. - Implementa manejo de errores: archivo no encontrado, JSON malformado, o sin cursos seleccionados (mostrar
messagebox.showerror). - Opcional: agrega un
Entryde búsqueda que filtre los cursos delListboxen tiempo real.
Este ejercicio consolida la interacción entre Combobox, Listbox, carga dinámica y gestión de eventos.
8 Listas desplegables y listas de selección en Tkinter: Listbox vs ttk.Combobox