87 lines
3.1 KiB
Python
87 lines
3.1 KiB
Python
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()
|