DMarlon Studio

Lección 8 · 8 de 20

Paneles redimensionables · tkinter

Divida una ventana de tkinter en paneles que se ajustan arrastrando con ttk.Panedwindow: horizontales, verticales, anidados y con pesos.

tkinter · Paneles redimensionables en DMarlon Studio: el código del ejemplo y la ventana que abre al ejecutarlo

ttk.Panedwindow reparte su espacio entre varios componentes, los paneles, separados por un divisor que se arrastra con el ratón. Con orient="horizontal" los pone en fila y con "vertical", en columna.

Los paneles se añaden con add(componente, weight=n). El peso decide cómo se reparte el espacio que sobra al agrandar la ventana: la parte derecha tiene peso 4 y las carpetas 1, así que el correo crece cuatro veces más deprisa.

Se pueden anidar: el panel derecho es otro Panedwindow, vertical, con la lista de mensajes arriba y el texto del mensaje abajo. Es la distribución típica de un programa de correo.

Los tres componentes comparten opciones con el diccionario look y **look. exportselection=False es importante: sin ella, elegir algo en una lista borraría la selección de la otra. La etiqueta se empaqueta la primera, con side="bottom", para que nunca quede tapada.

Desde el código, sashpos(0, 200) coloca el primer divisor (cuando la ventana ya se ve) y forget(panel) quita un panel. Este componente no está en la paleta de DMarlon Studio, pero puede escribirlo en el código de cualquier ventana que diseñe.

Código · main.py

import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.title("Mail")root.geometry("640x360")ttk.Label(root, text="Drag the dividers to resize the panes").pack(side="bottom", anchor="w", padx=10, pady=(0, 6))look = dict(bg="white", fg="black", highlightthickness=0, exportselection=False)# A Panedwindow splits its space; drag the sash between panes to resize them.outer = ttk.Panedwindow(root, orient="horizontal")outer.pack(fill="both", expand=True, padx=8, pady=8)folders = tk.Listbox(outer, width=16, activestyle="none", **look)folders.insert("end", "Inbox", "Sent", "Drafts", "Archive", "Trash")folders.selection_set(0)# Panes can be nested: the right side is split again, top to bottom.right = ttk.Panedwindow(outer, orient="vertical")mails = tk.Listbox(right, height=5, activestyle="none", **look)for line in ["Ana — Meeting on Monday", "Luis — Invoice 2041",             "Marta — Photos from the trip", "Shop — Your order has shipped"]:    mails.insert("end", line)mails.selection_set(0)body = tk.Text(right, height=6, wrap="word", font=("Helvetica", 13), padx=8, pady=6, **look)body.insert("1.0", "Hi team,\n\nThe meeting is on Monday at 10:00 in room 2.\n\nAna")# add(child, weight=n): extra space is shared out by weight.outer.add(folders, weight=1)outer.add(right, weight=4)right.add(mails, weight=1)right.add(body, weight=2)root.mainloop()

Para recordar

  • add(panel, weight=n) añade un panel con su peso.
  • El usuario arrastra el divisor para cambiar los tamaños.
  • Los Panedwindow se pueden anidar.
  • exportselection=False mantiene la selección de cada lista.

Ejercicio

Añada un tercer panel, a la derecha del todo, con una lista de contactos y peso 1; luego cambie los pesos y agrande la ventana para ver la diferencia.