From a96dfcdeed08a1be32b5d0390687359f15146612 Mon Sep 17 00:00:00 2001 From: mireya Date: Fri, 27 Feb 2026 11:40:53 +0000 Subject: [PATCH] Actualizar alarm_logic.py --- alarm_logic.py | 65 ++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/alarm_logic.py b/alarm_logic.py index 156ba10..b80239a 100644 --- a/alarm_logic.py +++ b/alarm_logic.py @@ -1,8 +1,10 @@ import datetime import shelve import os +import time +import tkinter as tk +from tkinter import ttk -# Nombre del archivo de base de datos para persistencia DB_FILE = 'alarm_data.db' def get_db_path(): @@ -10,23 +12,34 @@ def get_db_path(): return os.path.join(os.path.dirname(os.path.abspath(__file__)), DB_FILE) def load_alarms(): - """Carga todas las alarmas persistentes del archivo shelve.""" + """Carga las alarmas con un sistema de reintentos por si el archivo está ocupado.""" alarms = [] - try: - with shelve.open(get_db_path()) as db: - if 'alarms' in db: - alarms = list(db['alarms']) - except Exception as e: - print(f"Error al cargar alarmas: {e}") + + for _ in range(5): + try: + with shelve.open(get_db_path()) as db: + if 'alarms' in db: + alarms = list(db['alarms']) + break + except OSError as e: + time.sleep(0.1) + except Exception as e: + print(f"Error al cargar alarmas: {e}") + break return alarms def save_alarms(alarms): - """Guarda la lista completa de alarmas en el archivo shelve.""" - try: - with shelve.open(get_db_path(), writeback=True) as db: - db['alarms'] = alarms - except Exception as e: - print(f"Error al guardar alarmas: {e}") + """Guarda las alarmas con el mismo sistema de paciencia (reintentos).""" + for _ in range(5): + try: + with shelve.open(get_db_path(), writeback=True) as db: + db['alarms'] = alarms + break + except OSError: + time.sleep(0.1) + except Exception as e: + print(f"Error al guardar alarmas: {e}") + break def add_alarm(hour, minute, message): """Añade una nueva alarma y la guarda.""" @@ -69,13 +82,12 @@ def postpone_alarm(alarm_id): alarms = load_alarms() for alarm in alarms: if alarm['id'] == alarm_id: - # Creamos un objeto datetime temporal para calcular la nueva hora current_time = datetime.datetime(1, 1, 1, alarm['hour'], alarm['minute']) new_time = current_time + datetime.timedelta(minutes=1) alarm['hour'] = new_time.hour alarm['minute'] = new_time.minute - alarm['active'] = True # Vuelve a estar activa para sonar en 1 minuto + alarm['active'] = True break save_alarms(alarms) return alarms @@ -94,38 +106,19 @@ def check_alarms(root, alarm_list_ref, notify_callback): for alarm in alarms: if alarm['active'] and alarm['hour'] == current_hour and alarm['minute'] == current_minute: - # 1. Llamar a la función de notificación del POP-UP en main_app notify_callback(alarm) - # 2. Desactivar temporalmente la alarma en la lógica interna (en caso de que el usuario no la posponga o detenga) - # Esto previene que suene en cada segundo dentro del mismo minuto. alarm['active'] = False - # 3. Guardar el cambio de estado save_alarms(alarms) - # 4. Actualizar la lista visible en la UI alarm_list_ref.update_list(alarms) break - # Volver a programar la comprobación para el siguiente segundo root.after(1000, check_alarms, root, alarm_list_ref, notify_callback) - - - # alarm_logic.py (COMIENZO DEL ARCHIVO) -import datetime -import shelve -import os -import tkinter as tk # NECESARIO para Toplevel y otros widgets -from tkinter import ttk # NECESARIO si usas widgets ttk -# ... (rest of the initial code) ... - -# ... (all functions like load_alarms, postpone_alarm, check_alarms, etc.) ... - -# --- NUEVA CLASE MOVIDA DESDE main_app.py --- class CustomAlarmDialog(tk.Toplevel): """Ventana de diálogo personalizada para la alarma con botones renombrados.""" def __init__(self, master, alarm_data): @@ -148,11 +141,9 @@ class CustomAlarmDialog(tk.Toplevel): button_frame = tk.Frame(self) button_frame.pack(pady=10) - # Botón POSPONER tk.Button(button_frame, text="POSPONER (1 min)", command=lambda: self.on_action('posponer'), bg='blue', fg='white').pack(side=tk.LEFT, padx=10) - # Botón DETENER tk.Button(button_frame, text="DETENER", command=lambda: self.on_action('detener'), bg='red', fg='white').pack(side=tk.LEFT, padx=10)