✨ BASES DE DATOS CON ALMA ✨
Tkinter + SQLite: el arte de guardar historias
Objetivo: Diseñar una aplicación de escritorio con Tkinter y SQLite que gestione datos reales, integrando creatividad, pensamiento lógico y responsabilidad ética, para solucionar necesidades cotidianas con tecnología propia.
Competencia a alcanzar: Construir interfaces gráficas funcionales que interactúen con una base de datos relacional, aplicando buenas prácticas, depuración consciente y trabajo colaborativo para transformar ideas en herramientas útiles.
📖 Historia: Valeria, una estudiante de bachillerato, llevaba un diario con todas las recetas de su abuela. Un día su cuaderno se mojó y perdió años de recuerdos. Ella dijo: “Necesito una aplicación donde pueda guardar, buscar y nunca perder mis recetas”. Así nació la idea: ¿Y si tú construyes con Python + SQLite un organizador personal que proteja lo valioso? 💡
Hoy programarás una pequeña agenda que puede extenderse a inventarios, contactos o sueños. Porque cada dato cuenta una historia.
✨ La creatividad encuentra su forma digital
Tkinter es la biblioteca estándar de Python que te permite crear ventanas, botones y formularios. SQLite es una base de datos ligera que vive dentro de tu programa. Juntos forman un dúo poderoso: interfaz amigable + persistencia confiable.
Imagina que construyes un gestor de tareas donde cada tarea tiene título, descripción y fecha. Tkinter te da el lienzo para que el usuario ingrese datos; SQLite los guarda para siempre (o hasta que los borres). Hoy aprenderás a conectar ambos mundos.
✅ Filosofía estoica aplicada: La tecnología es una herramienta, pero tu enfoque determina su impacto. Programa con intención, cada línea refleja tu propósito de ayudar.
Conexión entre interfaz y datos
A continuación, un programa que crea una ventana Tkinter para registrar estudiantes y los almacena en SQLite. ¡Analízalo, modifícalo, experimenta!
import sqlite3
import tkinter as tk
from tkinter import messagebox, ttk
# --- CONEXIÓN Y CREACIÓN DE TABLA ---
conn = sqlite3.connect('tareas.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS tareas (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT NOT NULL,
estado TEXT DEFAULT 'pendiente')''')
conn.commit()
def agregar_tarea():
tarea = entry_tarea.get()
if tarea:
c.execute("INSERT INTO tareas (nombre) VALUES (?)", (tarea,))
conn.commit()
entry_tarea.delete(0, tk.END)
mostrar_tareas()
else:
messagebox.showwarning("Advertencia", "Escribe una tarea")
def mostrar_tareas():
for row in tree.get_children():
tree.delete(row)
c.execute("SELECT * FROM tareas")
for tarea in c.fetchall():
tree.insert('', tk.END, values=tarea)
def completada_tarea():
selected = tree.selection()
if selected:
item = tree.item(selected)
tarea_id = item['values'][0]
c.execute("UPDATE tareas SET estado = 'completada' WHERE id = ?", (tarea_id,))
conn.commit()
mostrar_tareas()
def eliminar_tarea():
selected = tree.selection()
if selected:
item = tree.item(selected)
tarea_id = item['values'][0]
c.execute("DELETE FROM tareas WHERE id = ?", (tarea_id,))
conn.commit()
mostrar_tareas()
# Ventana principal
ventana = tk.Tk()
ventana.title("Mis Tareas estoicas")
ventana.geometry("550x450")
ventana.configure(bg='#f0f4f8')
frame_sup = tk.Frame(ventana, bg='#f0f4f8')
frame_sup.pack(pady=12)
tk.Label(frame_sup, text="📌 Nueva tarea:", font=('Segoe UI', 12), bg='#f0f4f8').pack(side=tk.LEFT, padx=5)
entry_tarea = tk.Entry(frame_sup, width=30, font=('Segoe UI', 11))
entry_tarea.pack(side=tk.LEFT, padx=5)
btn_agregar = tk.Button(frame_sup, text="➕ Agregar", command=agregar_tarea, bg='#2c6e9e', fg='white', font=('Segoe UI', 10))
btn_agregar.pack(side=tk.LEFT, padx=5)
frame_botones = tk.Frame(ventana, bg='#f0f4f8')
frame_botones.pack(pady=6)
btn_completada = tk.Button(frame_botones, text="✅ completada", command=completada_tarea, bg='#4a8b6e', fg='white')
btn_completada.pack(side=tk.LEFT, padx=10)
btn_eliminar = tk.Button(frame_botones, text="🗑️ Eliminar", command=eliminar_tarea, bg='#b6492e', fg='white')
btn_eliminar.pack(side=tk.LEFT, padx=10)
tree = ttk.Treeview(ventana, columns=('ID', 'Tarea', 'Estado'), show='headings', height=12)
tree.heading('ID', text='ID')
tree.heading('Tarea', text='Descripción')
tree.heading('Estado', text='Estado')
tree.column('ID', width=40)
tree.column('Tarea', width=300)
tree.column('Estado', width=100)
tree.pack(pady=15, padx=20, fill=tk.BOTH, expand=True)
mostrar_tareas()
ventana.mainloop()
conn.close()
🧪 Desafío para tu mente crítica: Extiende este código para crear una "Agenda de proyectos comunitarios". Debe permitir agregar proyecto (nombre, responsable, fecha límite) y listarlos. Reflexiona: ¿cómo organizarías las tablas? ¿Qué validaciones agregarías para fomentar la ética de los datos? ¡Explora, rompe y reconstruye!
🔁 Consigna evaluativa: Implementa una nueva tabla "proyectos" con al menos 3 campos. Incluye un botón "Mostrar proyectos". Comparte con tu compañero y explícale cómo interactúa la interfaz con la base de datos. Aprendizaje colaborativo.
✨ Cada respuesta correcta suma 100 puntos. ¡Reflexiona antes de elegir!
Hoy hemos descubierto que Tkinter nos permite construir puentes visuales y SQLite nos brinda memoria persistente. Aprendimos que programar es diseñar soluciones con impacto humano. Cada tabla es una estructura de confianza, cada ventana es una oportunidad de servir.
✅ Resumen: Interfaz gráfica + base de datos local = aplicaciones reales. Integraste pensamiento lógico, creatividad y ética. El código no solo hace cosas, transforma realidades. Sigue explorando, pregunta, equivócate y mejora. ¡Sigue siendo un pensador estoico de la tecnología!