DMarlon Studio

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.

tkinter · Marcos para agrupar en DMarlon Studio: el código del ejemplo y la ventana que abre al ejecutarlo

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 Frame agrupa componentes; dentro, cada uno se coloca de nuevo.
  • El primer argumento de un componente es su contenedor.
  • LabelFrame añ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.