Ir al contenido principal

Aplicación de gestión de tareas

Introducción

La gestión de tareas es una aplicación práctica muy común en el mundo de la programación y representa un excelente proyecto para consolidar los conocimientos adquiridos sobre Python. Una aplicación de gestión de tareas permite al usuario añadir tareas, marcarlas como completadas, eliminarlas y visualizarlas de diferentes maneras. Este tipo de proyecto nos permite aplicar conceptos como estructuras de datos, funciones, entrada/salida y persistencia de datos, integrándolos en una aplicación funcional de uso cotidiano.

En este artículo, crearemos paso a paso una aplicación de gestión de tareas que podrás utilizar para organizar tus actividades diarias. El proyecto nos permitirá poner en práctica múltiples conceptos aprendidos hasta ahora, y resultará en una herramienta útil que podrás seguir mejorando con el tiempo.

Planificación de la aplicación

Antes de empezar a programar, es importante tener claro qué funcionalidades queremos implementar:

  1. Añadir nuevas tareas con descripción y prioridad
  2. Mostrar todas las tareas pendientes
  3. Marcar tareas como completadas
  4. Eliminar tareas
  5. Guardar las tareas en un archivo para mantenerlas entre sesiones
  6. Cargar las tareas desde el archivo al iniciar la aplicación

Estructura de datos

Para almacenar nuestras tareas, utilizaremos una lista de diccionarios. Cada diccionario representará una tarea con sus atributos:

# Ejemplo de estructura de una tarea
tarea = {
    "id": 1,
    "descripcion": "Comprar pan",
    "prioridad": "Alta",
    "completada": False,
    "fecha_creacion": "2023-10-15"
}

Implementación de la aplicación

Comencemos implementando nuestra aplicación de gestión de tareas:

import os
import json
from datetime import date

# Variables globales
ARCHIVO_TAREAS = "tareas.json"
tareas = []
contador_id = 0

# Funciones principales
def cargar_tareas():
    """Carga las tareas desde el archivo JSON."""
    global tareas, contador_id
    if os.path.exists(ARCHIVO_TAREAS):
        try:
            with open(ARCHIVO_TAREAS, 'r', encoding='utf-8') as archivo:
                tareas = json.load(archivo)
                # Actualizar el contador de ID al más alto encontrado
                if tareas:
                    contador_id = max(tarea["id"] for tarea in tareas)
        except Exception as e:
            print(f"Error al cargar tareas: {e}")
            tareas = []
    else:
        tareas = []

def guardar_tareas():
    """Guarda las tareas en el archivo JSON."""
    try:
        with open(ARCHIVO_TAREAS, 'w', encoding='utf-8') as archivo:
            json.dump(tareas, archivo, indent=4)
        print("Tareas guardadas correctamente.")
    except Exception as e:
        print(f"Error al guardar tareas: {e}")

def añadir_tarea(descripcion, prioridad="Media"):
    """Añade una nueva tarea a la lista."""
    global contador_id
    contador_id += 1
    
    nueva_tarea = {
        "id": contador_id,
        "descripcion": descripcion,
        "prioridad": prioridad,
        "completada": False,
        "fecha_creacion": str(date.today())
    }
    
    tareas.append(nueva_tarea)
    print(f"Tarea '{descripcion}' añadida con ID {contador_id}.")
    guardar_tareas()

def mostrar_tareas(mostrar_completadas=False):
    """Muestra la lista de tareas pendientes o todas si se especifica."""
    if not tareas:
        print("No hay tareas en la lista.")
        return
    
    print("\n=== LISTA DE TAREAS ===")
    for tarea in tareas:
        if not tarea["completada"] or mostrar_completadas:
            estado = "✓" if tarea["completada"] else " "
            print(f"[{estado}] {tarea['id']}. {tarea['descripcion']} (Prioridad: {tarea['prioridad']})")
    print("=====================")

def marcar_completada(id_tarea):
    """Marca una tarea como completada."""
    for tarea in tareas:
        if tarea["id"] == id_tarea:
            tarea["completada"] = True
            print(f"Tarea '{tarea['descripcion']}' marcada como completada.")
            guardar_tareas()
            return
    print(f"No se encontró ninguna tarea con ID {id_tarea}.")

def eliminar_tarea(id_tarea):
    """Elimina una tarea de la lista."""
    global tareas
    tareas_filtradas = [tarea for tarea in tareas if tarea["id"] != id_tarea]
    
    if len(tareas_filtradas) < len(tareas):
        tareas = tareas_filtradas
        print(f"Tarea con ID {id_tarea} eliminada.")
        guardar_tareas()
    else:
        print(f"No se encontró ninguna tarea con ID {id_tarea}.")

def menu_principal():
    """Muestra el menú principal y procesa la elección del usuario."""
    while True:
        print("\n=== GESTOR DE TAREAS ===")
        print("1. Añadir tarea")
        print("2. Mostrar tareas pendientes")
        print("3. Mostrar todas las tareas")
        print("4. Marcar tarea como completada")
        print("5. Eliminar tarea")
        print("6. Salir")
        
        opcion = input("\nElige una opción (1-6): ")
        
        if opcion == "1":
            descripcion = input("Descripción de la tarea: ")
            print("Prioridades disponibles: Baja, Media, Alta")
            prioridad = input("Prioridad (por defecto 'Media'): ")
            if not prioridad:
                prioridad = "Media"
            añadir_tarea(descripcion, prioridad)
        
        elif opcion == "2":
            mostrar_tareas(mostrar_completadas=False)
        
        elif opcion == "3":
            mostrar_tareas(mostrar_completadas=True)
        
        elif opcion == "4":
            mostrar_tareas(mostrar_completadas=True)
            id_tarea = int(input("ID de la tarea a marcar como completada: "))
            marcar_completada(id_tarea)
        
        elif opcion == "5":
            mostrar_tareas(mostrar_completadas=True)
            id_tarea = int(input("ID de la tarea a eliminar: "))
            eliminar_tarea(id_tarea)
        
        elif opcion == "6":
            print("¡Hasta pronto!")
            break
        
        else:
            print("Opción no válida. Intenta de nuevo.")

# Punto de entrada del programa
if __name__ == "__main__":
    print("Bienvenido al Gestor de Tareas")
    cargar_tareas()
    menu_principal()

Prueba de la aplicación

Para probar nuestra aplicación, simplemente ejecutamos el script y seguimos las instrucciones del menú. Por ejemplo:

  1. Elegimos la opción 1 para añadir una tarea
  2. Ingresamos la descripción: "Estudiar Python"
  3. Seleccionamos la prioridad: "Alta"
  4. Elegimos la opción 2 para ver nuestras tareas pendientes
  5. Podemos marcar tareas como completadas con la opción 4
  6. Y eliminar tareas con la opción 5

Mejoras posibles

Esta aplicación de gestión de tareas es funcional pero básica. Aquí hay algunas mejoras que podrías implementar:

  1. Fechas de vencimiento: Añadir fechas límite para las tareas
  2. Categorías: Permitir agrupar tareas por categorías
  3. Filtros: Filtrar tareas por prioridad o categoría
  4. Interfaz gráfica: Implementar una interfaz más amigable con una biblioteca como Tkinter
  5. Búsqueda: Permitir buscar tareas por palabras clave
  6. Estadísticas: Mostrar estadísticas sobre tareas completadas y pendientes

Resumen

En este artículo, hemos creado una aplicación de gestión de tareas funcional utilizando Python. Hemos aplicado varios conceptos importantes como estructuras de datos (listas y diccionarios), manipulación de archivos JSON para guardar datos, funciones para organizar el código y entrada/salida para interactuar con el usuario.

Esta aplicación sirve como un ejemplo práctico de cómo integrar diferentes elementos de Python en un proyecto útil. A medida que sigas avanzando en tu aprendizaje, podrás añadir más funcionalidades y mejorar la interfaz de usuario para crear una herramienta más potente y personalizada para la gestión de tus tareas diarias.