Python para Pensadores

Taller diseñado con el corazón de un docente y la mente de un programador
Tema: Python - Manejo de Ventanas Emergentes

Objetivo de Aprendizaje

Dominar el manejo de ventanas emergentes en Python mediante la biblioteca Tkinter, integrando competencias técnicas para crear interfaces gráficas funcionales, habilidades cognitivas para resolver problemas de interacción usuario-sistema, y actitudes de curiosidad y ética digital, con el propósito de desarrollar aplicaciones que respondan de manera intuitiva y accesible a necesidades reales de comunicación en entornos educativos y sociales.

¿Por qué aprender esto?

Imagina crear una aplicación que notifique a los estudiantes sobre tareas pendientes, confirme acciones importantes o solicite datos esenciales de manera elegante y profesional. Las ventanas emergentes son la puerta de diálogo entre tu programa y el usuario.

Contextualización

Estás desarrollando una aplicación para el gobierno estudiantil de tu colegio que necesita registrar voluntarios para una campaña de reforestación. ¿Cómo solicitarás los datos de contacto? ¿Cómo confirmarás que la inscripción fue exitosa? ¿Cómo alertarás si falta información importante?

En la vida digital, las ventanas emergentes son como los gestos y expresiones faciales en una conversación: indican atención, confirman entendimiento, piden aclaración o muestran alerta. En Python, con la biblioteca Tkinter, podemos darle estas capacidades conversacionales a nuestras aplicaciones.

Este taller te llevará desde la curiosidad inicial ("¿cómo hago que aparezca un mensaje?") hasta la maestría consciente ("¿qué tipo de diálogo es el más adecuado para esta interacción?"), transformando líneas de código en puentes de comunicación.

Ventana de diálogo básica
import tkinter as tk
from tkinter import messagebox

# Crear ventana principal
ventana = tk.Tk()
ventana.title("Diálogo con el usuario")
ventana.geometry("400x300")

def mostrar_saludo():
    messagebox.showinfo("Saludo", "¡Hola, estudiante! Bienvenido al taller.")

# Botón para mostrar ventana emergente
btn_saludo = tk.Button(ventana, text="Saludar", command=mostrar_saludo)
btn_saludo.pack(pady=20)

ventana.mainloop()

Desarrollo de la Actividad

1. Tipos de Ventanas Emergentes

Tkinter ofrece varios tipos de diálogos para diferentes situaciones:

  • showinfo(): Muestra información general
  • showwarning(): Advierte sobre situaciones potencialmente problemáticas
  • showerror(): Indica que ocurrió un error
  • askquestion(): Pregunta que requiere respuesta Sí/No
  • askyesno(): Similar a askquestion pero devuelve valores booleanos
  • askokcancel(): Pide confirmación para continuar o cancelar
Ejemplo práctico: Diferentes tipos de diálogos
import tkinter as tk
from tkinter import messagebox

def mostrar_dialogos():
    # Diálogo de información
    messagebox.showinfo("Información", "Tu inscripción se ha registrado correctamente.")
    
    # Diálogo de advertencia
    messagebox.showwarning("Advertencia", "Tu sesión expirará en 5 minutos.")
    
    # Diálogo de error
    messagebox.showerror("Error", "No se pudo conectar con el servidor.")
    
    # Diálogo de pregunta
    respuesta = messagebox.askquestion("Confirmación", "¿Estás seguro de eliminar este registro?")
    if respuesta == 'yes':
        print("Registro eliminado")
    else:
        print("Operación cancelada")
    
    # Diálogo Sí/No
    continuar = messagebox.askyesno("Continuar", "¿Deseas guardar los cambios antes de salir?")
    if continuar:
        print("Cambios guardados")
    else:
        print("Cambios descartados")

# Crear ventana de prueba
ventana = tk.Tk()
ventana.title("Práctica de Diálogos")
ventana.geometry("500x400")

btn_dialogos = tk.Button(ventana, text="Probar Diálogos", command=mostrar_dialogos)
btn_dialogos.pack(pady=50)

ventana.mainloop()

2. Personalización de Diálogos

Podemos personalizar los diálogos para que se adapten mejor a nuestras aplicaciones:

Diálogo personalizado con icono y botones específicos
import tkinter as tk
from tkinter import messagebox

def dialogo_personalizado():
    # Diálogo con icono personalizado y botones específicos
    respuesta = messagebox.askyesnocancel(
        "Guardar proyecto",
        "¿Deseas guardar el proyecto antes de salir?",
        icon="question",
        default="yes"  # Botón por defecto
    )
    
    if respuesta is True:
        print("Proyecto guardado")
    elif respuesta is False:
        print("Cambios descartados")
    else:
        print("Operación cancelada")

ventana = tk.Tk()
ventana.title("Diálogos Personalizados")
ventana.geometry("500x400")

btn_personalizado = tk.Button(ventana, text="Diálogo Personalizado", 
                               command=dialogo_personalizado)
btn_personalizado.pack(pady=50)

# Ejemplo de diálogo con detalles expandibles
def dialogo_detallado():
    import tkinter as tk
    from tkinter import messagebox, Toplevel, Label, Button
    
    # Crear ventana de detalles
    detalle_ventana = Toplevel()
    detalle_ventana.title("Detalles del Error")
    detalle_ventana.geometry("400x200")
    
    Label(detalle_ventana, text="Error 404: Recurso no encontrado", 
          font=("Arial", 14, "bold")).pack(pady=10)
    Label(detalle_ventana, text="El archivo 'datos_estudiantes.csv' no existe en la ruta especificada.").pack(pady=5)
    Label(detalle_ventana, text="Posibles soluciones:").pack(pady=5)
    Label(detalle_ventana, text="1. Verificar la ruta del archivo").pack()
    Label(detalle_ventana, text="2. Crear el archivo desde el menú Archivo > Nuevo").pack()
    
    Button(detalle_ventana, text="Cerrar", command=detalle_ventana.destroy).pack(pady=20)

btn_detalle = tk.Button(ventana, text="Mostrar Error Detallado", 
                        command=dialogo_detallado)
btn_detalle.pack(pady=20)

ventana.mainloop()

Experimenta por ti mismo

Intenta modificar el código anterior para:

  1. Cambiar el texto de los botones en el diálogo personalizado
  2. Agregar un diálogo que pregunte la edad del usuario y valide si es mayor de 15 años
  3. Crear un diálogo de "acerca de" que muestre información del desarrollador

El Reto Final

Desarrolla una aplicación para el gobierno estudiantil que gestione las inscripciones a la campaña de reforestación "Un árbol, una vida". La aplicación debe:

Requisitos:

  1. Solicitar mediante ventanas emergentes:
    • Nombre completo del voluntario
    • Curso y paralelo
    • Correo electrónico
    • Disponibilidad (mañana, tarde o ambos)
  2. Validar que todos los campos estén completos
  3. Confirmar la inscripción con un diálogo personalizado
  4. Permitir cancelar la inscripción en cualquier momento
  5. Mostrar un resumen de la inscripción al final

Desafío adicional (para los más curiosos):

Crea un diálogo personalizado que muestre un calendario para que el voluntario seleccione la fecha en la que participará. Investiga sobre el módulo tkcalendar o crea tu propia interfaz con botones.

Estructura base para el reto
import tkinter as tk
from tkinter import messagebox, simpledialog

class InscripcionReforestacion:
    def __init__(self):
        self.ventana = tk.Tk()
        self.ventana.title("Campaña: Un árbol, una vida")
        self.ventana.geometry("600x500")
        
        # Variables para almacenar datos
        self.nombre = ""
        self.curso = ""
        self.correo = ""
        self.disponibilidad = ""
        
        self.crear_interfaz()
        
    def crear_interfaz(self):
        # Título
        titulo = tk.Label(self.ventana, 
                         text="Inscripción Campaña de Reforestación",
                         font=("Arial", 18, "bold"),
                         fg="#2E86C1")
        titulo.pack(pady=20)
        
        # Botones para cada paso
        btn_paso1 = tk.Button(self.ventana, text="1. Registrar Datos",
                              command=self.registrar_datos, width=20, height=2)
        btn_paso1.pack(pady=10)
        
        btn_paso2 = tk.Button(self.ventana, text="2. Confirmar Inscripción",
                              command=self.confirmar_inscripcion, width=20, height=2)
        btn_paso2.pack(pady=10)
        
        btn_paso3 = tk.Button(self.ventana, text="3. Ver Resumen",
                              command=self.mostrar_resumen, width=20, height=2)
        btn_paso3.pack(pady=10)
        
        btn_salir = tk.Button(self.ventana, text="Salir",
                              command=self.salir, width=20, height=2, bg="#E74C3C", fg="white")
        btn_salir.pack(pady=30)
        
    def registrar_datos(self):
        # Aquí implementarás la solicitud de datos con ventanas emergentes
        pass
    
    def confirmar_inscripcion(self):
        # Aquí implementarás la confirmación
        pass
    
    def mostrar_resumen(self):
        # Aquí implementarás el resumen
        pass
    
    def salir(self):
        respuesta = messagebox.askyesno("Salir", "¿Estás seguro de salir?")
        if respuesta:
            self.ventana.quit()
    
    def ejecutar(self):
        self.ventana.mainloop()

# Para ejecutar la aplicación
if __name__ == "__main__":
    app = InscripcionReforestacion()
    app.ejecutar()

Trabajo en equipo

Forma equipos de 3 personas y distribuye los roles:

  • Diseñador de interfaz: Encargado de la apariencia y usabilidad
  • Programador de lógica: Encargado de las validaciones y flujo de datos
  • Probador y documentador: Encargado de encontrar errores y documentar el proceso

Al finalizar, cada equipo presentará su solución y explicará las decisiones de diseño tomadas.

Evaluación Lúdica

Demuestra lo que has aprendido completando este juego de preguntas. ¡Cada respuesta correcta vale 20 puntos!

¿Cuál es la función correcta para mostrar un diálogo de información en Tkinter?
Puntuación: 0/100