Lección 13 · 13 de 20
Marcos para agrupar · tkinter
Agrupe un formulario de tkinter con Frame y LabelFrame: secciones con título, filas de etiqueta y campo, y una barra de botones.

Un marco (ttk.Frame) es un contenedor sin borde: sirve para agrupar componentes y colocarlos juntos. Los hijos se crean con el marco como primer argumento, por ejemplo ttk.Label(row, ...), y se colocan dentro de él.
field crea cada fila: un Frame con la etiqueta a la izquierda (side="left" y width=8, para que todas midan lo mismo) y el campo, que ocupa el resto con fill="x", expand=True. Así las etiquetas y los campos quedan alineados en columna.
Un `ttk.LabelFrame` es un marco con borde y título (text="Personal data"); padding=12 deja margen por dentro. Cada sección se coloca con pack(fill="x") para que ocupe todo el ancho, y padx y pady la separan de lo demás.
La barra de abajo es otro marco con los botones a la derecha: pack(side="right") coloca primero Save en el borde y después Cancel a su izquierda.
En DMarlon Studio es el Marco de la paleta: los componentes que se sueltan encima quedan dentro de él al generar el código. El LabelFrame no está en la paleta; se puede añadir en la pestaña Código.
Código · main.py
import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.title("Frames")root.geometry("520x330")# Each row is a small Frame: the label on the left, the entry beside it.def field(parent, label, value): row = ttk.Frame(parent) row.pack(fill="x", pady=3) ttk.Label(row, text=label, width=8).pack(side="left") entry = ttk.Entry(row) entry.insert(0, value) entry.pack(side="left", fill="x", expand=True)# LabelFrame: a frame with a border and a title.person = ttk.LabelFrame(root, text="Personal data", padding=12)person.pack(fill="x", padx=16, pady=(16, 0))field(person, "Name", "Grace Hopper")field(person, "Email", "grace@example.com")address = ttk.LabelFrame(root, text="Address", padding=12)address.pack(fill="x", padx=16, pady=12)field(address, "Street", "12 Navy Road")field(address, "City", "Arlington")# A frame for the buttons, aligned to the right.buttons = ttk.Frame(root)buttons.pack(fill="x", padx=16)ttk.Button(buttons, text="Save").pack(side="right")ttk.Button(buttons, text="Cancel").pack(side="right", padx=8)root.mainloop()Para recordar
- Un
Frameagrupa componentes; dentro, cada uno se coloca de nuevo. - El primer argumento de un componente es su contenedor.
LabelFrameañade un borde y un título a la sección.- Una función que crea filas evita repetir código.
Ejercicio
Añada una tercera sección «Contact» con los campos «Phone» y «Website» usando la misma función field.