import tkinter as tk from tkinter import scrolledtext from server import start_server class VistaChat: def __init__(self, root, controlador): self.root = root self.root.title("Chat Cliente-Servidor") self.root.geometry("500x400") # Establece tamaño fijo self.root.resizable(False, False) # Bloquea el redimensionamiento self.root.configure(bg="#2C3E50") self.controlador = controlador # Estilos de los botones btn_style = {"font": ("Arial", 10, "bold"), "fg": "white", "bg": "#2980B9", "bd": 0, "relief": "flat"} # FRAME LATERAL PARA EL MENÚ self.menu_frame = tk.Frame(root, width=100, bg="#34495E") self.menu_frame.grid(row=0, column=0, rowspan=3, sticky="ns") #self.button_inicio = tk.Button(self.menu_frame, text="Inicio", command=self.mostrar_inicio, width=12, **btn_style) #self.button_inicio.pack(pady=10) self.button_conf = tk.Button(self.menu_frame, text="Conf", command=self.mostrar_config, width=12, **btn_style) self.button_conf.pack(pady=10) # Almacenar botones de clientes conectados self.chat_buttons = {} self.chats_frames = {} # FRAME PRINCIPAL DONDE SE MUESTRA EL CHAT O LA CONFIGURACIÓN self.main_frame = tk.Frame(root, bg="#2C3E50") self.main_frame.grid(row=0, column=1, padx=10, pady=10, rowspan=3) # INICIALIZA LOS CHATS Y CONFIGURACIÓN self.inicializar_config() #self.inicializar_chat("127.0.0.1") # Chat local por defecto #self.mostrar_chat("127.0.0.1") def inicializar_chat(self, host): """Crea un nuevo chat con un host específico.""" chat_frame = tk.Frame(self.main_frame, bg="#2C3E50") chat_display = scrolledtext.ScrolledText(chat_frame, wrap=tk.WORD, state='disabled', width=50, height=15, bg="#ECF0F1", fg="black") chat_display.pack(padx=10, pady=10) entry_frame = tk.Frame(chat_frame, bg="#2C3E50") entry_frame.pack(pady=5) message_entry = tk.Entry(entry_frame, width=40, font=("Arial", 10)) message_entry.pack(side=tk.LEFT, padx=10, pady=5) send_button = tk.Button(entry_frame, text="Enviar", command=lambda: self.controlador.enviar_mensaje(host), state='disabled', font=("Arial", 10, "bold"), fg="white", bg="#27AE60", bd=0, relief="flat") send_button.pack(side=tk.RIGHT, padx=5, pady=5) self.chats_frames[host] = { "frame": chat_frame, "display": chat_display, "entry": message_entry, "send_button": send_button } def inicializar_config(self): """Configura la interfaz de configuración.""" self.config_frame = tk.Frame(self.main_frame, bg="#2C3E50") tk.Label(self.config_frame, text="HOST:", bg="#2C3E50", fg="white", font=("Arial", 10, "bold")).pack(pady=2) self.host_entry = tk.Entry(self.config_frame, width=20, font=("Arial", 10)) self.host_entry.pack(pady=5) self.host_entry.insert(0, "127.0.0.1") tk.Label(self.config_frame, text="PORT:", bg="#2C3E50", fg="white", font=("Arial", 10, "bold")).pack(pady=2) self.port_entry = tk.Entry(self.config_frame, width=10, font=("Arial", 10)) self.port_entry.pack(pady=5) self.port_entry.insert(0, "3333") btn_style = {"font": ("Arial", 10, "bold"), "fg": "white", "bg": "#2980B9", "bd": 0, "relief": "flat"} self.connect_button = tk.Button(self.config_frame, text="Conectar Cliente", command=self.controlador.conectar_cliente, **btn_style) self.connect_button.pack(pady=10) self.start_server = tk.Button(self.config_frame, text="Abrir servidor", command=self.controlador.iniciar_servidor, **btn_style) self.start_server.pack(pady=20) def mostrar_inicio(self): """Muestra la pantalla de chat predeterminado (127.0.0.1).""" self.config_frame.pack_forget() if "127.0.0.1" in self.chats_frames: self.chats_frames["127.0.0.1"]["frame"].pack() def mostrar_chat(self, host): """Muestra un chat específico y oculta los anteriores, incluyendo la configuración.""" # Ocultar la configuración si está visible self.config_frame.pack_forget() # Ocultar todos los chats antes de mostrar el nuevo for chat_host, chat in self.chats_frames.items(): chat["frame"].pack_forget() # Mostrar el chat seleccionado if host in self.chats_frames: self.chats_frames[host]["frame"].pack() def mostrar_config(self): """Muestra la pantalla de configuración y oculta cualquier chat abierto.""" # Ocultar todos los chats for chat in self.chats_frames.values(): chat["frame"].pack_forget() # Mostrar la configuración self.config_frame.pack() def mostrar_mensaje(self, host, mensaje): """Muestra un mensaje en el chat correspondiente.""" if host in self.chats_frames: chat_display = self.chats_frames[host]["display"] chat_display.config(state='normal') chat_display.insert(tk.END, mensaje + '\n') chat_display.config(state='disabled') chat_display.yview(tk.END) def habilitar_envio(self, host): """Habilita el botón de enviar mensajes para el chat correspondiente.""" if host in self.chats_frames: self.chats_frames[host]["send_button"].config(state='normal') def deshabilitar_envio(self): """Deshabilita el botón de enviar mensajes.""" self.send_button.config(state='disabled') def agregar_boton_chat(self, host): """Agrega un nuevo botón al menú lateral cuando se conecta un nuevo cliente.""" if host not in self.chat_buttons: btn_style = {"font": ("Arial", 10, "bold"), "fg": "white", "bg": "#2980B9", "bd": 0, "relief": "flat"} chat_button = tk.Button(self.menu_frame, text=f"Chat {host}", command=lambda: self.mostrar_chat(host), width=12, **btn_style) chat_button.pack(pady=5) self.chat_buttons[host] = chat_button self.inicializar_chat(host)