130 lines
5.6 KiB
Python
130 lines
5.6 KiB
Python
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() |