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.
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
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:
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:
- Cambiar el texto de los botones en el diálogo personalizado
- Agregar un diálogo que pregunte la edad del usuario y valide si es mayor de 15 años
- 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:
- Solicitar mediante ventanas emergentes:
- Nombre completo del voluntario
- Curso y paralelo
- Correo electrónico
- Disponibilidad (mañana, tarde o ambos)
- Validar que todos los campos estén completos
- Confirmar la inscripción con un diálogo personalizado
- Permitir cancelar la inscripción en cualquier momento
- 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.
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!