Actualizar alarm_logic.py
This commit is contained in:
parent
833d0de607
commit
a96dfcdeed
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue