diff --git a/src/main.py b/src/main.py index 90e77fb..6ccb86b 100644 --- a/src/main.py +++ b/src/main.py @@ -1,11 +1,11 @@ from ui.centered_window import CenteredWindow def main(): - # Crear una instancia de la ventana centrada - app = CenteredWindow() - - # Ejecutar la ventana - app.mainloop() + try: + app = CenteredWindow() + app.mainloop() + except Exception as e: + print(f"Error al iniciar la aplicación: {e}") if __name__ == "__main__": main() \ No newline at end of file diff --git a/src/services/__pycache__/processes_manager.cpython-312.pyc b/src/services/__pycache__/processes_manager.cpython-312.pyc index 7e006a2..36687d9 100644 Binary files a/src/services/__pycache__/processes_manager.cpython-312.pyc and b/src/services/__pycache__/processes_manager.cpython-312.pyc differ diff --git a/src/services/__pycache__/system_monitor.cpython-312.pyc b/src/services/__pycache__/system_monitor.cpython-312.pyc new file mode 100644 index 0000000..5f7df9d Binary files /dev/null and b/src/services/__pycache__/system_monitor.cpython-312.pyc differ diff --git a/src/services/__pycache__/tetris_game.cpython-312.pyc b/src/services/__pycache__/tetris_game.cpython-312.pyc index 3129ef5..bf6431b 100644 Binary files a/src/services/__pycache__/tetris_game.cpython-312.pyc and b/src/services/__pycache__/tetris_game.cpython-312.pyc differ diff --git a/src/services/__pycache__/threads_manager.cpython-312.pyc b/src/services/__pycache__/threads_manager.cpython-312.pyc index d7623ae..f1639a6 100644 Binary files a/src/services/__pycache__/threads_manager.cpython-312.pyc and b/src/services/__pycache__/threads_manager.cpython-312.pyc differ diff --git a/src/services/processes_manager.py b/src/services/processes_manager.py index 24cc16a..5d4541c 100644 --- a/src/services/processes_manager.py +++ b/src/services/processes_manager.py @@ -25,4 +25,4 @@ class ProcessManager: # Fallback al navegador por defecto si Chrome falla webbrowser.open(path_or_url) else: - print(f"Error: {e}") \ No newline at end of file + print(f"Error: {e}") diff --git a/src/services/system_monitor.py b/src/services/system_monitor.py new file mode 100644 index 0000000..8ecdd77 --- /dev/null +++ b/src/services/system_monitor.py @@ -0,0 +1,88 @@ +import psutil +import matplotlib.pyplot as plt +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +import threading +import tkinter as tk +import time + +class SystemMonitor: + def __init__(self, parent_frame): + self.parent_frame = parent_frame + self.max_data_points = 60 + self.running = True # Indicador para detener los hilos + self.metrics = { + "CPU Usage": { + "data": [], + "thread": None, + "fetch_func": psutil.cpu_percent, + "interval": 1 + }, + "RAM Usage": { + "data": [], + "thread": None, + "fetch_func": lambda: psutil.virtual_memory().percent, + "interval": 1 + } + } + self.graphs = {} + self.init_graphs() + + def init_graphs(self): + """Crea gráficos para todas las métricas y arranca sus hilos de actualización.""" + for metric, config in self.metrics.items(): + fig, ax, line = self.create_graph(metric) + self.graphs[metric] = {"figure": fig, "axis": ax, "line": line} + + # Crear y arrancar el hilo para actualizar esta métrica + thread = threading.Thread(target=self.update_metric, args=(metric,), daemon=True) + self.metrics[metric]["thread"] = thread + thread.start() + + def create_graph(self, title): + """Crea un gráfico para una métrica específica.""" + frame = tk.Frame(self.parent_frame) + frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) + + label = tk.Label(frame, text=title, font=("Arial", 14, "bold")) + label.pack() + + fig, ax = plt.subplots(figsize=(5, 3)) + ax.set_title(title) + ax.set_xlabel("Time") + ax.set_ylabel("Usage (%)") + ax.set_ylim(0, 100) + line, = ax.plot([], [], lw=2) + + canvas = FigureCanvasTkAgg(fig, frame) + canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) + + return fig, ax, line + + def update_metric(self, metric): + config = self.metrics[metric] + while self.running: + try: + new_data = config["fetch_func"]() + config["data"].append(new_data) + + if len(config["data"]) > self.max_data_points: + config["data"].pop(0) + + self.update_graph(metric, config["data"]) + time.sleep(config["interval"]) + except Exception as e: + print(f"Error en update_metric ({metric}): {e}") + + + + def update_graph(self, metric, data): + """Actualiza un gráfico con nuevos datos.""" + graph = self.graphs[metric] + x = list(range(len(data))) + graph["line"].set_data(x, data) + graph["axis"].set_xlim(0, len(data)) + graph["figure"].canvas.draw() + + def stop_threads(self): + """Detiene la ejecución de todos los hilos de monitoreo.""" + self.running = False diff --git a/src/ui/__pycache__/CenteredWindow.cpython-312.pyc b/src/ui/__pycache__/CenteredWindow.cpython-312.pyc deleted file mode 100644 index 8f1030f..0000000 Binary files a/src/ui/__pycache__/CenteredWindow.cpython-312.pyc and /dev/null differ diff --git a/src/ui/__pycache__/centered_window.cpython-312.pyc b/src/ui/__pycache__/centered_window.cpython-312.pyc index e240a8e..8e6af31 100644 Binary files a/src/ui/__pycache__/centered_window.cpython-312.pyc and b/src/ui/__pycache__/centered_window.cpython-312.pyc differ