Taller diseñado con el corazón de un docente y la mente de un programador
Desarrollar una interfaz gráfica funcional utilizando los widgets esenciales de Tkinter (Listbox, Radiobutton, Checkbutton y Treeview) que permita a los estudiantes aplicar principios de diseño de UI/UX, ejercitar el pensamiento lógico para estructurar datos visualmente, y fomentar la creatividad al resolver problemas de representación de información, con el fin de crear aplicaciones que respondan a necesidades reales de organización y presentación de datos en contextos educativos y comunitarios.
Imagina que eres el coordinador del club de tecnología de tu colegio y necesitas crear un sistema para gestionar los proyectos que los estudiantes van a presentar en la feria científica. Tienes que organizar quiénes participan, qué categorías hay, qué materiales necesitan y el estado de cada proyecto. ¿Cómo representarías toda esta información de forma clara y atractiva?
En la vida cotidiana, constantemente interactuamos con interfaces que nos presentan opciones (como los menús de comida rápida), listas de elementos (como las playlists de música) y datos organizados en tablas (como las calificaciones en el portal estudiantil). Hoy aprenderemos a crear estas mismas experiencias usando Python, conectando la programación con las necesidades reales de organización y presentación de información que enfrentamos como estudiantes y ciudadanos digitales.
Vamos a construir paso a paso una aplicación para gestionar proyectos estudiantiles. Cada widget nos ayudará con una parte específica del sistema:
El Listbox nos permite mostrar una lista de elementos de los cuales el usuario puede seleccionar uno o varios. Es perfecto para mostrar los nombres de los proyectos registrados.
import tkinter as tk from tkinter import ttk # Crear ventana principal ventana = tk.Tk() ventana.title("Gestor de Proyectos Estudiantiles") ventana.geometry("800x600") # Crear un Listbox para mostrar proyectos label_proyectos = tk.Label(ventana, text="Proyectos registrados:") label_proyectos.pack(pady=10) listbox_proyectos = tk.Listbox(ventana, height=8, selectmode=tk.SINGLE) listbox_proyectos.pack(pady=5, padx=20, fill=tk.BOTH, expand=True) # Agregar algunos proyectos de ejemplo proyectos = ["Robot seguidor de línea", "App para reciclaje", "Sistema de riego automático", "Videojuego educativo", "Sistema de seguridad con Arduino"] for proyecto in proyectos: listbox_proyectos.insert(tk.END, proyecto) ventana.mainloop()
Los Radiobutton permiten seleccionar UNA sola opción de un conjunto. Ideal para escoger la categoría del proyecto (Ciencias, Tecnología, Arte, etc.).
# Crear Radiobuttons para categorías label_categoria = tk.Label(ventana, text="Selecciona la categoría del proyecto:") label_categoria.pack(pady=10) # Variable para almacenar la selección categoria_seleccionada = tk.StringVar(value="Tecnología") categorias = [("Ciencias", "Ciencias"), ("Tecnología", "Tecnología"), ("Arte", "Arte"), ("Sociales", "Sociales")] for texto, valor in categorias: rb = tk.Radiobutton(ventana, text=texto, value=valor, variable=categoria_seleccionada) rb.pack(anchor=tk.W, padx=40)
Los Checkbutton permiten seleccionar VARIAS opciones de un conjunto. Perfecto para marcar qué recursos necesita el proyecto (impresión 3D, componentes electrónicos, etc.).
# Crear Checkbuttons para recursos necesarios label_recursos = tk.Label(ventana, text="Recursos necesarios (puedes seleccionar varios):") label_recursos.pack(pady=10) # Variables para cada Checkbutton necesita_impresion = tk.BooleanVar() necesita_electronica = tk.BooleanVar() necesita_programacion = tk.BooleanVar() cb1 = tk.Checkbutton(ventana, text="Impresión 3D", variable=necesita_impresion) cb2 = tk.Checkbutton(ventana, text="Componentes electrónicos", variable=necesita_electronica) cb3 = tk.Checkbutton(ventana, text="Asesoría en programación", variable=necesita_programacion) cb1.pack(anchor=tk.W, padx=40) cb2.pack(anchor=tk.W, padx=40) cb3.pack(anchor=tk.W, padx=40)
El Treeview es un widget poderoso que permite mostrar datos en formato de tabla con filas y columnas. Ideal para presentar un resumen de todos los proyectos con sus detalles.
# Crear un Treeview (tabla) para mostrar el resumen de proyectos label_resumen = tk.Label(ventana, text="Resumen de proyectos:", font=("Arial", 12, "bold")) label_resumen.pack(pady=10) # Crear el Treeview con columnas tree = ttk.Treeview(ventana, columns=("Proyecto", "Categoría", "Recursos", "Estado"), show="headings", height=6) # Configurar las columnas tree.heading("Proyecto", text="Nombre del Proyecto") tree.heading("Categoría", text="Categoría") tree.heading("Recursos", text="Recursos Necesarios") tree.heading("Estado", text="Estado") tree.column("Proyecto", width=200) tree.column("Categoría", width=100) tree.column("Recursos", width=150) tree.column("Estado", width=100) # Insertar algunos datos de ejemplo tree.insert("", tk.END, values=("Robot seguidor de línea", "Tecnología", "Electrónica, Programación", "En progreso")) tree.insert("", tk.END, values=("App para reciclaje", "Sociales", "Programación", "Completado")) tree.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
Reflexión: ¿Cómo cambiaría la experiencia del usuario si estos widgets estuvieran en diferentes posiciones? ¿Qué información adicional sería útil mostrar en cada uno? Experimenta cambiando los textos, colores y disposición de los widgets.
Tu desafío es crear una aplicación completa para gestionar los participantes de las olimpiadas de programación de tu institución. La aplicación debe incluir:
Piensa críticamente: ¿Cómo validarías que no se ingresen datos duplicados? ¿Qué hacer si un participante quiere cambiar de categoría? ¿Cómo harías para exportar esta información a un archivo?
Este reto te prepara para situaciones reales donde necesitas organizar información de manera eficiente y crear interfaces intuitivas que solucionen problemas concretos de tu comunidad.