import tkinter as tk from tkinter import Menu from tkinter import ttk import threading from app.chat_server.Server import Server from app.widgets import ClockLabel from app.ConfigMgr import ConfigMgr from app.widgets.ChatTab import ChatTab from app.widgets.UsageLabels import CPULabel, RAMLabel, BatteryLabel, NetworkLabel # Evento para detener threads de manera segura stop_event = threading.Event() def on_closing(): """Gestiona el cierre de la aplicación de manera segura.""" # Detiene todos los threads relacionados con stop_event stop_event.set() # Cierra la ventana principal root.quit() root.destroy() def on_config_changed(): """Actualiza la configuración del servidor y nombre de usuario en el chat.""" chat_frame.change_server_url(config_manager.config["Chat"]["server"]) chat_frame.change_sender_name(config_manager.config["Chat"]["name"]) # Crea la ventana principal root = tk.Tk() root.title("Responsive Window") # Título de la ventana root.geometry("1150x700") # Tamaño inicial de la ventana # Inicializa el gestor de configuración config_manager = ConfigMgr(root, config_changed_listener=on_config_changed) # Inicializa el servidor de chat server = Server(host="localhost", port=2020, stop_event=stop_event) # Configura la ventana principal para que sea responsive root.columnconfigure(0, weight=0) # Columna izquierda con tamaño fijo root.columnconfigure(1, weight=1) # Columna central ajustable root.columnconfigure(2, weight=0) # Columna derecha con tamaño fijo root.rowconfigure(0, weight=1) # Fila principal ajustable root.rowconfigure(1, weight=0) # Barra de estado con tamaño fijo # Crea el menú superior menu_bar = Menu(root) # Menú Archivo file_menu = Menu(menu_bar, tearoff=0) file_menu.add_command(label="New") # Comando Nuevo file_menu.add_command(label="Open") # Comando Abrir file_menu.add_separator() # Separador visual file_menu.add_command(label="Config", command=config_manager.display_config_window) # Configuración file_menu.add_command(label="Exit", command=on_closing) # Salir # Menú Edición edit_menu = Menu(menu_bar, tearoff=0) edit_menu.add_command(label="Copy") # Comando Copiar edit_menu.add_command(label="Paste") # Comando Pegar # Añade los menús al menú principal menu_bar.add_cascade(label="File", menu=file_menu) menu_bar.add_cascade(label="Edit", menu=edit_menu) # Asigna el menú a la ventana principal root.config(menu=menu_bar) # Crea los marcos laterales y central frame_left = tk.Frame(root, bg="lightblue", width=200) # Marco izquierdo frame_center = tk.Frame(root, bg="white") # Marco central chat_frame = ChatTab(root, chat_server_url=config_manager.config["Chat"]["server"], sender_name=config_manager.config["Chat"]["name"], stop_event=stop_event, width=200, bg="lightgreen") # Marco derecho para el chat # Coloca los marcos en la cuadrícula frame_left.grid(row=0, column=0, sticky="ns") # Marco izquierdo frame_center.grid(row=0, column=1, sticky="nsew") # Marco central chat_frame.grid(row=0, column=2, sticky="ns") # Marco derecho # Configura tamaños fijos para los marcos laterales frame_left.grid_propagate(False) chat_frame.grid_propagate(False) # Divide el marco central en dos partes (superior ajustable e inferior fijo) frame_center.rowconfigure(0, weight=1) # Parte superior ajustable frame_center.rowconfigure(1, weight=0) # Parte inferior fija frame_center.columnconfigure(0, weight=1) # Ancho ajustable # Crea sub-marcos dentro del marco central frame_top = tk.Frame(frame_center, bg="lightyellow") # Parte superior frame_bottom = tk.Frame(frame_center, bg="lightgray", height=100) # Parte inferior # Coloca los sub-marcos en el marco central frame_top.grid(row=0, column=0, sticky="nsew") # Parte superior frame_bottom.grid(row=1, column=0, sticky="ew") # Parte inferior # Fija el tamaño de la parte inferior frame_bottom.grid_propagate(False) # Crea la barra de estado status_bar = tk.Label(root, text="Status bar", bg="lightgray", anchor="w") # Barra de estado status_bar.grid(row=1, column=0, columnspan=3, sticky="ew") # Configura un cuaderno (notebook) para widgets style = ttk.Style() style.configure("CustomNotebook.TNotebook.Tab", font=("Arial", 12, "bold")) notebook = ttk.Notebook(frame_top, style="CustomNotebook.TNotebook") notebook.pack(fill="both", expand=True) # Añade etiquetas de uso del sistema label_cpu = CPULabel(status_bar, bg="lightgreen", font=("Helvetica", 10), relief="groove", anchor="center", width=10, stop_event=stop_event) # Uso de CPU label_ram = RAMLabel(status_bar, bg="lightcoral", font=("Helvetica", 10), relief="groove", anchor="center", width=10, stop_event=stop_event) # Uso de RAM label_battery = BatteryLabel(status_bar, bg="lightblue", font=("Helvetica", 10), relief="groove", anchor="center", width=20, stop_event=stop_event) # Batería label_net = NetworkLabel(status_bar, text="Network", bg="lightpink", font=("Helvetica", 10), relief="groove", anchor="center", width=20, stop_event=stop_event) # Red label_time = ClockLabel(status_bar, font=("Helvetica", 12), bd=1, fg="darkblue", relief="sunken", anchor="center", width=20, stop_event=stop_event) # Reloj # Coloca las etiquetas en la barra de estado label_cpu.pack(side="left", fill="both", expand=True) label_ram.pack(side="left", fill="both", expand=True) label_battery.pack(side="left", fill="both", expand=True) label_net.pack(side="left", fill="both", expand=True) label_time.pack(side="right", fill="both", expand=True) # Configura la acción para el cierre de la ventana root.protocol("WM_DELETE_WINDOW", on_closing) # Inicia la aplicación root.mainloop()