WhatsApp

  

8 Listas desplegables y listas de selección en Tkinter: Listbox vs ttk.Combobox

Aprende a usar Listbox y ttk.Combobox en Tkinter, con ejemplos de carga dinámica, selección simple y múltiple, y un ejercicio práctico para consolidar los conceptos.

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 a SINGLE pero 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.
  • validate y validatecommand – Permiten validar la entrada cuando state='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.Combobox ya 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:

  1. Al iniciar, la aplicación debe cargar una lista de carreras desde un archivo carreras.json y mostrarlas en un ttk.Combobox (selección única).
  2. Al seleccionar una carrera, la aplicación debe leer un segundo archivo cursos_{carrera}.json y poblar un Listbox con los cursos disponibles, permitiendo selección múltiple (EXTENDED).
  3. Incluye un botón “Inscribir” que, al pulsarse, escribe en inscripciones.txt el nombre de la carrera y los cursos seleccionados, con marca de tiempo.
  4. Implementa manejo de errores: archivo no encontrado, JSON malformado, o sin cursos seleccionados (mostrar messagebox.showerror).
  5. Opcional: agrega un Entry de búsqueda que filtre los cursos del Listbox en tiempo real.

Este ejercicio consolida la interacción entre Combobox, Listbox, carga dinámica y gestión de eventos.

© 2025 TuNombre – Tutoriales de Python y GUI con Tkinter.

 

8 Listas desplegables y listas de selección en Tkinter: Listbox vs ttk.Combobox
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 10 diciembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
7 Editores de texto sencillos con Tkinter: Text y Scrollbar
Aprende a crear editores de texto básicos en Python usando Tkinter. Conoce el widget Text, sus diferencias con Entry, operaciones CRUD, integración de Scrollbar y un ejemplo completo de mini bloc de notas con botón de limpieza.