import tkinter as tk from tkinter import ttk import threading def crear_solapa_todo(tab): """Crea una pestaña de To-Do List que usa TODO el espacio disponible.""" tareas = [] # Configurar el frame principal para que use todo el espacio frame_principal = ttk.Frame(tab, padding=10) frame_principal.grid(row=0, column=0, sticky="nsew") tab.columnconfigure(0, weight=1) tab.rowconfigure(0, weight=1) frame_principal.columnconfigure(0, weight=1) frame_principal.rowconfigure(1, weight=1) # La lista de tareas ocupa el mayor espacio # Estilos para botones de colores style = ttk.Style() style.configure("BotonAzul.TButton", font=("Arial", 12, "bold"), foreground="#007BFF", background="#007BFF") style.configure("BotonRojo.TButton", font=("Arial", 12, "bold"), foreground="#DC3545", background="#DC3545") style.configure("BotonVerde.TButton", font=("Arial", 12, "bold"), foreground="#28A745", background="#28A745") # Entrada para agregar nuevas tareas entry = ttk.Entry(frame_principal, font=("Arial", 14)) entry.grid(row=0, column=0, padx=5, pady=5, sticky="ew") # Marco para la lista con scroll frame_lista = ttk.Frame(frame_principal) frame_lista.grid(row=1, column=0, pady=5, sticky="nsew") frame_lista.columnconfigure(0, weight=1) frame_lista.rowconfigure(0, weight=1) # ListBox con scrollbar todo_listbox = tk.Listbox(frame_lista, font=("Arial", 14), selectbackground="#00A8E8") todo_listbox.grid(row=0, column=0, sticky="nsew") scrollbar = ttk.Scrollbar(frame_lista, orient="vertical", command=todo_listbox.yview) scrollbar.grid(row=0, column=1, sticky="ns") todo_listbox.config(yscrollcommand=scrollbar.set) # Marco inferior para botones frame_botones = ttk.Frame(frame_principal) frame_botones.grid(row=2, column=0, pady=5, sticky="ew") frame_botones.columnconfigure((0,1,2), weight=1) # Botones boton_agregar = ttk.Button(frame_botones, text="➕ Agregar", style="BotonAzul.TButton", command=lambda: agregar_tarea(entry, todo_listbox, tareas)) boton_agregar.grid(row=0, column=0, padx=5, sticky="ew") boton_eliminar = ttk.Button(frame_botones, text="🗑️ Eliminar", style="BotonRojo.TButton", command=lambda: eliminar_tarea(todo_listbox, tareas)) boton_eliminar.grid(row=0, column=1, padx=5, sticky="ew") boton_marcar = ttk.Button(frame_botones, text="✔️ Marcar", style="BotonVerde.TButton", command=lambda: marcar_tarea(todo_listbox, tareas)) boton_marcar.grid(row=0, column=2, padx=5, sticky="ew") # Inicializar la lista vacía actualizar_todo_list(todo_listbox, tareas) def actualizar_todo_list(todo_listbox, tareas): """Actualizar la lista de tareas en la interfaz.""" todo_listbox.delete(0, tk.END) for tarea, completada in tareas: estado = "✅" if completada else "⬜" todo_listbox.insert(tk.END, f"{estado} {tarea}") def agregar_tarea(entry, todo_listbox, tareas): """Agregar una nueva tarea a la lista en un hilo separado.""" def tarea_hilo(): nueva_tarea = entry.get() if nueva_tarea.strip(): tareas.append((nueva_tarea, False)) # Agregar como tarea no completada todo_listbox.after(0, actualizar_todo_list, todo_listbox, tareas) entry.delete(0, tk.END) threading.Thread(target=tarea_hilo).start() def eliminar_tarea(todo_listbox, tareas): """Eliminar una tarea de la lista.""" def tarea_hilo(): seleccion = todo_listbox.curselection() if seleccion: indice = seleccion[0] tareas.pop(indice) todo_listbox.after(0, actualizar_todo_list, todo_listbox, tareas) threading.Thread(target=tarea_hilo).start() def marcar_tarea(todo_listbox, tareas): """Marcar la tarea seleccionada como completada o no.""" def tarea_hilo(): seleccion = todo_listbox.curselection() if seleccion: indice = seleccion[0] tarea, completada = tareas[indice] tareas[indice] = (tarea, not completada) # Alternar estado todo_listbox.after(0, actualizar_todo_list, todo_listbox, tareas) threading.Thread(target=tarea_hilo).start()