Actualizar alarm_logic.py

This commit is contained in:
mireya 2026-02-27 11:40:53 +00:00
parent 833d0de607
commit a96dfcdeed
1 changed files with 28 additions and 37 deletions

View File

@ -1,8 +1,10 @@
import datetime import datetime
import shelve import shelve
import os 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' DB_FILE = 'alarm_data.db'
def get_db_path(): 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) return os.path.join(os.path.dirname(os.path.abspath(__file__)), DB_FILE)
def load_alarms(): 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 = [] alarms = []
try:
with shelve.open(get_db_path()) as db: for _ in range(5):
if 'alarms' in db: try:
alarms = list(db['alarms']) with shelve.open(get_db_path()) as db:
except Exception as e: if 'alarms' in db:
print(f"Error al cargar alarmas: {e}") 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 return alarms
def save_alarms(alarms): def save_alarms(alarms):
"""Guarda la lista completa de alarmas en el archivo shelve.""" """Guarda las alarmas con el mismo sistema de paciencia (reintentos)."""
try: for _ in range(5):
with shelve.open(get_db_path(), writeback=True) as db: try:
db['alarms'] = alarms with shelve.open(get_db_path(), writeback=True) as db:
except Exception as e: db['alarms'] = alarms
print(f"Error al guardar alarmas: {e}") 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): def add_alarm(hour, minute, message):
"""Añade una nueva alarma y la guarda.""" """Añade una nueva alarma y la guarda."""
@ -69,13 +82,12 @@ def postpone_alarm(alarm_id):
alarms = load_alarms() alarms = load_alarms()
for alarm in alarms: for alarm in alarms:
if alarm['id'] == alarm_id: 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']) current_time = datetime.datetime(1, 1, 1, alarm['hour'], alarm['minute'])
new_time = current_time + datetime.timedelta(minutes=1) new_time = current_time + datetime.timedelta(minutes=1)
alarm['hour'] = new_time.hour alarm['hour'] = new_time.hour
alarm['minute'] = new_time.minute alarm['minute'] = new_time.minute
alarm['active'] = True # Vuelve a estar activa para sonar en 1 minuto alarm['active'] = True
break break
save_alarms(alarms) save_alarms(alarms)
return alarms return alarms
@ -94,38 +106,19 @@ def check_alarms(root, alarm_list_ref, notify_callback):
for alarm in alarms: for alarm in alarms:
if alarm['active'] and alarm['hour'] == current_hour and alarm['minute'] == current_minute: 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) 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 alarm['active'] = False
# 3. Guardar el cambio de estado
save_alarms(alarms) save_alarms(alarms)
# 4. Actualizar la lista visible en la UI
alarm_list_ref.update_list(alarms) alarm_list_ref.update_list(alarms)
break break
# Volver a programar la comprobación para el siguiente segundo
root.after(1000, check_alarms, root, alarm_list_ref, notify_callback) 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): class CustomAlarmDialog(tk.Toplevel):
"""Ventana de diálogo personalizada para la alarma con botones renombrados.""" """Ventana de diálogo personalizada para la alarma con botones renombrados."""
def __init__(self, master, alarm_data): def __init__(self, master, alarm_data):
@ -148,11 +141,9 @@ class CustomAlarmDialog(tk.Toplevel):
button_frame = tk.Frame(self) button_frame = tk.Frame(self)
button_frame.pack(pady=10) button_frame.pack(pady=10)
# Botón POSPONER
tk.Button(button_frame, text="POSPONER (1 min)", command=lambda: self.on_action('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) 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'), tk.Button(button_frame, text="DETENER", command=lambda: self.on_action('detener'),
bg='red', fg='white').pack(side=tk.LEFT, padx=10) bg='red', fg='white').pack(side=tk.LEFT, padx=10)