import tkinter as tk from tkinter import messagebox class MDIApplication(tk.Tk): def __init__(self): super().__init__() self.title("Aplicación MDI con Tkinter") self.geometry("800x600") # Contador para nombrar las ventanas hijas self.child_count = 0 # Menú superior self.create_menu() def create_menu(self): # Crear barra de menú menubar = tk.Menu(self) # Menú "Archivo" file_menu = tk.Menu(menubar, tearoff=0) file_menu.add_command(label="Nuevo Documento", command=self.open_new_document) file_menu.add_separator() file_menu.add_command(label="Salir", command=self.quit) menubar.add_cascade(label="Archivo", menu=file_menu) # Menú "Ventana" para organizar ventanas window_menu = tk.Menu(menubar, tearoff=0) window_menu.add_command(label="Organizar en Cascada", command=self.cascade_windows) window_menu.add_command(label="Organizar en Mosaico", command=self.tile_windows) menubar.add_cascade(label="Ventana", menu=window_menu) # Configurar la barra de menú self.config(menu=menubar) def open_new_document(self): """Abrir una nueva ventana hija (documento)""" self.child_count += 1 child = tk.Toplevel(self) child.title(f"Documento {self.child_count}") child.geometry("400x300") # Permitir mover las ventanas hijas child.transient(self) # Asegura que cada ventana es hija de la principal child.protocol("WM_DELETE_WINDOW", lambda: self.close_document(child)) # Etiqueta de ejemplo dentro de cada ventana hija label = tk.Label(child, text=f"Contenido del Documento {self.child_count}") label.pack(expand=True, padx=20, pady=20) def close_document(self, window): """Cerrar una ventana hija específica""" if messagebox.askokcancel("Cerrar documento", "¿Estás seguro de que deseas cerrar este documento?"): window.destroy() def cascade_windows(self): """Organizar ventanas hijas en cascada""" x_offset = 30 y_offset = 30 for idx, child in enumerate(self.winfo_children()): if isinstance(child, tk.Toplevel): child.geometry(f"400x300+{x_offset * idx}+{y_offset * idx}") def tile_windows(self): """Organizar ventanas hijas en mosaico""" children = [child for child in self.winfo_children() if isinstance(child, tk.Toplevel)] if not children: return num_children = len(children) cols = int(num_children ** 0.5) # Número de columnas en la cuadrícula rows = (num_children // cols) + (num_children % cols > 0) # Filas necesarias win_width = self.winfo_width() // cols win_height = self.winfo_height() // rows for idx, child in enumerate(children): row = idx // cols col = idx % cols x = col * win_width y = row * win_height child.geometry(f"{win_width}x{win_height}+{x}+{y}") if __name__ == "__main__": app = MDIApplication() app.mainloop()