Tried some more to close conections
This commit is contained in:
parent
36e1a225e6
commit
9e52887ebb
|
@ -2,7 +2,7 @@
|
||||||
<module type="PYTHON_MODULE" version="4">
|
<module type="PYTHON_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$" />
|
||||||
<orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" />
|
<orderEntry type="jdk" jdkName="Python 3.12" jdkType="Python SDK" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
|
@ -3,5 +3,5 @@
|
||||||
<component name="Black">
|
<component name="Black">
|
||||||
<option name="sdkName" value="Python 3.13" />
|
<option name="sdkName" value="Python 3.13" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13" project-jdk-type="Python SDK" />
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12" project-jdk-type="Python SDK" />
|
||||||
</project>
|
</project>
|
Binary file not shown.
Binary file not shown.
|
@ -19,6 +19,7 @@ class EmailClientPOP:
|
||||||
self.smtp_port = smtp_port
|
self.smtp_port = smtp_port
|
||||||
self.pop_conn = None
|
self.pop_conn = None
|
||||||
self.smtp_conn = None
|
self.smtp_conn = None
|
||||||
|
self.running = True
|
||||||
|
|
||||||
# Ruta del archivo SQLite:
|
# Ruta del archivo SQLite:
|
||||||
self.db_file = os.path.join("resources/db_email", "emails.db")
|
self.db_file = os.path.join("resources/db_email", "emails.db")
|
||||||
|
@ -59,7 +60,7 @@ class EmailClientPOP:
|
||||||
def connect_pop(self):
|
def connect_pop(self):
|
||||||
"""Conexión al servidor POP"""
|
"""Conexión al servidor POP"""
|
||||||
try:
|
try:
|
||||||
self.pop_conn = poplib.POP3(self.pop_server, self.pop_port)
|
self.pop_conn = poplib.POP3(self.pop_server, self.pop_port, timeout=10)
|
||||||
self.pop_conn.user(self.email)
|
self.pop_conn.user(self.email)
|
||||||
self.pop_conn.pass_(self.password)
|
self.pop_conn.pass_(self.password)
|
||||||
print("Conexión POP exitosa")
|
print("Conexión POP exitosa")
|
||||||
|
@ -70,7 +71,7 @@ class EmailClientPOP:
|
||||||
def connect_smtp(self):
|
def connect_smtp(self):
|
||||||
"""Conexión al servidor SMTP"""
|
"""Conexión al servidor SMTP"""
|
||||||
try:
|
try:
|
||||||
self.smtp_conn = smtplib.SMTP(self.smtp_server, self.smtp_port)
|
self.smtp_conn = smtplib.SMTP(self.smtp_server, self.smtp_port, timeout=10)
|
||||||
self.smtp_conn.login(self.email, self.password)
|
self.smtp_conn.login(self.email, self.password)
|
||||||
print("Conexión SMTP exitosa")
|
print("Conexión SMTP exitosa")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -84,7 +85,11 @@ class EmailClientPOP:
|
||||||
def reconnect(self):
|
def reconnect(self):
|
||||||
"""Intenta reconectar a los servidores POP y SMTP"""
|
"""Intenta reconectar a los servidores POP y SMTP"""
|
||||||
print("Intentando reconectar al servidor de correo...")
|
print("Intentando reconectar al servidor de correo...")
|
||||||
|
if not self.running:
|
||||||
|
return
|
||||||
|
if self.pop_conn is None:
|
||||||
self.connect_pop()
|
self.connect_pop()
|
||||||
|
if self.smtp_conn is None:
|
||||||
self.connect_smtp()
|
self.connect_smtp()
|
||||||
|
|
||||||
def fetch_unread_count(self):
|
def fetch_unread_count(self):
|
||||||
|
@ -203,7 +208,18 @@ class EmailClientPOP:
|
||||||
|
|
||||||
def close_connections(self):
|
def close_connections(self):
|
||||||
"""Cierra las conexiones POP y SMTP"""
|
"""Cierra las conexiones POP y SMTP"""
|
||||||
|
try:
|
||||||
if self.pop_conn:
|
if self.pop_conn:
|
||||||
self.pop_conn.quit()
|
self.pop_conn.quit()
|
||||||
|
self.pop_conn = None
|
||||||
|
print("Conexión POP cerrada.")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error al cerrar conexión POP: {e}")
|
||||||
|
|
||||||
|
try:
|
||||||
if self.smtp_conn:
|
if self.smtp_conn:
|
||||||
self.smtp_conn.quit()
|
self.smtp_conn.quit()
|
||||||
|
self.smtp_conn = None
|
||||||
|
print("Conexión SMTP cerrada.")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error al cerrar conexión SMTP: {e}")
|
||||||
|
|
|
@ -9,6 +9,7 @@ from src.services.threaden_task import ThreadenTask
|
||||||
|
|
||||||
class ThreadsManager:
|
class ThreadsManager:
|
||||||
"""Constructor"""
|
"""Constructor"""
|
||||||
|
|
||||||
def __init__(self, ui_instance, email_client):
|
def __init__(self, ui_instance, email_client):
|
||||||
self.ui_instance = ui_instance
|
self.ui_instance = ui_instance
|
||||||
self.email_client = email_client
|
self.email_client = email_client
|
||||||
|
@ -17,10 +18,10 @@ class ThreadsManager:
|
||||||
self.tasks = {
|
self.tasks = {
|
||||||
"time": ThreadenTask(),
|
"time": ThreadenTask(),
|
||||||
"temperature": ThreadenTask(),
|
"temperature": ThreadenTask(),
|
||||||
"emails":ThreadenTask(),
|
"emails": ThreadenTask(),
|
||||||
"email_client":ThreadenTask(),
|
"email_client": ThreadenTask(),
|
||||||
"tetris_game":ThreadenTask(),
|
"tetris_game": ThreadenTask(),
|
||||||
"scrapper":ThreadenTask(),
|
"scrapper": ThreadenTask(),
|
||||||
"radio_player": ThreadenTask(),
|
"radio_player": ThreadenTask(),
|
||||||
}
|
}
|
||||||
self.system_monitor_tasks = {}
|
self.system_monitor_tasks = {}
|
||||||
|
@ -58,13 +59,13 @@ class ThreadsManager:
|
||||||
if hasattr(self.ui_instance, "tetris_game"):
|
if hasattr(self.ui_instance, "tetris_game"):
|
||||||
self.tasks["tetris_game"].start(self.update_tetris_game)
|
self.tasks["tetris_game"].start(self.update_tetris_game)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def stop_threads(self):
|
def stop_threads(self):
|
||||||
"""Recorre tasks y para los hilos"""
|
"""Detiene todos los hilos y cierra las conexiones."""
|
||||||
for name, task in self.tasks.items():
|
for name, task in self.tasks.items():
|
||||||
task.stop()
|
task.stop()
|
||||||
print(f"Hilo '{name}' detenido")
|
print(f"Hilo '{name}' detenido")
|
||||||
|
if name == "email_client" and hasattr(self.email_client, "close_connections"):
|
||||||
|
self.email_client.close_connections()
|
||||||
|
|
||||||
for name, task in self.system_monitor_tasks.items():
|
for name, task in self.system_monitor_tasks.items():
|
||||||
task.stop()
|
task.stop()
|
||||||
|
@ -73,7 +74,6 @@ class ThreadsManager:
|
||||||
if self.system_monitor:
|
if self.system_monitor:
|
||||||
self.system_monitor.running = False
|
self.system_monitor.running = False
|
||||||
|
|
||||||
|
|
||||||
def update_tetris_game(self):
|
def update_tetris_game(self):
|
||||||
"""Ciclo de actualizacion del tetris game"""
|
"""Ciclo de actualizacion del tetris game"""
|
||||||
while self.tasks["tetris_game"].running:
|
while self.tasks["tetris_game"].running:
|
||||||
|
@ -85,7 +85,6 @@ class ThreadsManager:
|
||||||
print(f"Error en update_tetris_game: {e}")
|
print(f"Error en update_tetris_game: {e}")
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
def update_system_metric(self, metric):
|
def update_system_metric(self, metric):
|
||||||
"""Actualiza una métrica específica del monitor del sistema."""
|
"""Actualiza una métrica específica del monitor del sistema."""
|
||||||
while self.system_monitor_tasks[metric].running:
|
while self.system_monitor_tasks[metric].running:
|
||||||
|
@ -95,14 +94,14 @@ class ThreadsManager:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error updating metric {metric}: {e}")
|
print(f"Error updating metric {metric}: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def update_time(self):
|
def update_time(self):
|
||||||
while self.tasks["time"].running:
|
while self.tasks["time"].running:
|
||||||
current_time = datetime.datetime.now().strftime('%H:%M:%S')
|
current_time = datetime.datetime.now().strftime('%H:%M:%S')
|
||||||
current_date = datetime.datetime.now().strftime('%d/%m/%Y')
|
current_date = datetime.datetime.now().strftime('%d/%m/%Y')
|
||||||
self.ui_instance.after(0, lambda: self.ui_instance.info_labels["hora"].configure(text=f"Hora: {current_time}"))
|
self.ui_instance.after(0,
|
||||||
self.ui_instance.after(0, lambda: self.ui_instance.info_labels["fecha"].configure(text=f"Fecha: {current_date}"))
|
lambda: self.ui_instance.info_labels["hora"].configure(text=f"Hora: {current_time}"))
|
||||||
|
self.ui_instance.after(0, lambda: self.ui_instance.info_labels["fecha"].configure(
|
||||||
|
text=f"Fecha: {current_date}"))
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
def update_temperature(self):
|
def update_temperature(self):
|
||||||
|
@ -114,7 +113,8 @@ class ThreadsManager:
|
||||||
if temperature is not None:
|
if temperature is not None:
|
||||||
self.ui_instance.after(
|
self.ui_instance.after(
|
||||||
0,
|
0,
|
||||||
lambda: self.ui_instance.info_labels["temperatura"].configure(text=f"Temperatura local: {temperature}°C")
|
lambda: self.ui_instance.info_labels["temperatura"].configure(
|
||||||
|
text=f"Temperatura local: {temperature}°C")
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error al obtener la temperatura: {e}")
|
print(f"Error al obtener la temperatura: {e}")
|
||||||
|
@ -139,9 +139,12 @@ class ThreadsManager:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error en el EmailClient: {e}")
|
print(f"Error en el EmailClient: {e}")
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
|
finally:
|
||||||
|
self.email_client.close_connections()
|
||||||
|
print("Cliente de correo detenido y conexiones cerradas")
|
||||||
|
|
||||||
def update_emails(self):
|
def update_emails(self):
|
||||||
"""Actualiza la cantidad de correos no leidos en tiempo real"""
|
"""Actualiza la cantidad de correos no leídos en tiempo real."""
|
||||||
while self.tasks["emails"].running:
|
while self.tasks["emails"].running:
|
||||||
try:
|
try:
|
||||||
if not self.email_client.is_connected():
|
if not self.email_client.is_connected():
|
||||||
|
@ -149,6 +152,7 @@ class ThreadsManager:
|
||||||
|
|
||||||
if self.email_client.is_connected():
|
if self.email_client.is_connected():
|
||||||
unread_count = self.email_client.fetch_unread_count()
|
unread_count = self.email_client.fetch_unread_count()
|
||||||
|
if self.ui_instance.winfo_exists(): # Verifica si la ventana aún existe
|
||||||
self.ui_instance.after(
|
self.ui_instance.after(
|
||||||
0,
|
0,
|
||||||
lambda: self.ui_instance.info_labels["emails"].configure(
|
lambda: self.ui_instance.info_labels["emails"].configure(
|
||||||
|
@ -157,16 +161,7 @@ class ThreadsManager:
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
print("No hay conexión al servidor de correo")
|
print("No hay conexión al servidor de correo")
|
||||||
self.ui_instance.after(
|
|
||||||
0,
|
|
||||||
lambda: self.ui_instance.info_labels["emails"].configure(
|
|
||||||
text="Servidor no disponible"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error en el hilo de correos: {e}")
|
print(f"Error en el hilo de correos: {e}")
|
||||||
time.sleep(60)
|
time.sleep(60)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -64,24 +64,37 @@ class CenteredWindow(ctk.CTk):
|
||||||
|
|
||||||
def on_close(self):
|
def on_close(self):
|
||||||
"""Maneja el cierre de la ventana"""
|
"""Maneja el cierre de la ventana"""
|
||||||
|
try:
|
||||||
|
# Establecer bandera de cierre para el cliente de correo
|
||||||
|
if hasattr(self, "email_client") and self.email_client:
|
||||||
|
self.email_client.running = False
|
||||||
|
|
||||||
|
# Detener todos los hilos
|
||||||
self.thread_manager.stop_threads()
|
self.thread_manager.stop_threads()
|
||||||
|
|
||||||
|
# Cancelar tareas programadas en Tkinter
|
||||||
|
for task in self.after_tasks:
|
||||||
|
try:
|
||||||
|
self.after_cancel(task)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error al cancelar tarea programada: {e}")
|
||||||
|
|
||||||
|
# Cerrar conexiones del cliente POP/SMTP
|
||||||
|
if hasattr(self, "email_client") and self.email_client:
|
||||||
|
self.email_client.close_connections()
|
||||||
|
|
||||||
|
# Detener tareas adicionales (Tetris, scraping)
|
||||||
if hasattr(self, "tetris_game") and self.tetris_game.running:
|
if hasattr(self, "tetris_game") and self.tetris_game.running:
|
||||||
self.tetris_game.stop_game()
|
self.tetris_game.stop_game()
|
||||||
|
|
||||||
if "tetris_game" in self.thread_manager.tasks:
|
if hasattr(self.thread_manager, "scrapper") and self.thread_manager.scrapper:
|
||||||
self.thread_manager.tasks["tetris_game"].stop()
|
|
||||||
|
|
||||||
if hasattr(self.thread_manager, "scrapper"):
|
|
||||||
self.thread_manager.scrapper.stop_scraping()
|
self.thread_manager.scrapper.stop_scraping()
|
||||||
|
|
||||||
if self.system_monitor:
|
# Destruir la ventana principal
|
||||||
self.system_monitor.running = False
|
|
||||||
|
|
||||||
for task in self.after_tasks:
|
|
||||||
self.after_cancel(task)
|
|
||||||
|
|
||||||
self.destroy()
|
self.destroy()
|
||||||
|
print("Aplicación cerrada correctamente.")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error al cerrar la aplicación: {e}")
|
||||||
|
|
||||||
def create_left_panel(self):
|
def create_left_panel(self):
|
||||||
# Panel izquierdo
|
# Panel izquierdo
|
||||||
|
@ -335,7 +348,7 @@ class CenteredWindow(ctk.CTk):
|
||||||
listbox_frame.grid(row=0, column=0, sticky="nsew", padx=10, pady=10)
|
listbox_frame.grid(row=0, column=0, sticky="nsew", padx=10, pady=10)
|
||||||
|
|
||||||
# Crear una lista de correos con un scrollbar
|
# Crear una lista de correos con un scrollbar
|
||||||
self.email_listbox = ctk.CTkTextbox(listbox_frame, width=800, height=800)
|
self.email_listbox = ctk.CTkTextbox(listbox_frame, width=600, height=600)
|
||||||
self.email_listbox.grid(row=0, column=0, sticky="nsew", padx=10, pady=10)
|
self.email_listbox.grid(row=0, column=0, sticky="nsew", padx=10, pady=10)
|
||||||
self.email_listbox.configure(state="disabled") # Inicialmente deshabilitada
|
self.email_listbox.configure(state="disabled") # Inicialmente deshabilitada
|
||||||
|
|
||||||
|
@ -375,9 +388,11 @@ class CenteredWindow(ctk.CTk):
|
||||||
|
|
||||||
if self.email_client.is_connected():
|
if self.email_client.is_connected():
|
||||||
emails = self.email_client.fetch_emails()
|
emails = self.email_client.fetch_emails()
|
||||||
self.email_listbox.delete(0, tk.END)
|
self.email_listbox.configure(state="normal")
|
||||||
|
self.email_listbox.delete("1.0", tk.END) # Borra todo el contenido actual
|
||||||
for email in emails:
|
for email in emails:
|
||||||
self.email_listbox.insert(tk.END, f"{email['subject']} - {email['from']}")
|
self.email_listbox.insert(tk.END, f"De: {email['sender']}\nAsunto: {email['subject']}\n\n")
|
||||||
|
self.email_listbox.configure(state="disabled")
|
||||||
else:
|
else:
|
||||||
print("No hay conexión al servidor de correo.")
|
print("No hay conexión al servidor de correo.")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
Loading…
Reference in New Issue