thread4/pruebas_ventanas/mdi.py

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()