Lección 20 · 20 de 20
Proyecto: formulario de registro · tkinter
Un formulario de registro con tkinter y grid: campos, contraseña, lista desplegable, opciones, casilla y un botón que comprueba los datos.

El formulario es un ttk.Frame con grid: las etiquetas van en la columna 0, pegadas a la derecha con sticky="e", y los componentes en la columna 1, que crece con columnconfigure(1, weight=1).
put coloca un componente en la columna 1 de una fila y lo devuelve; así se crea, se coloca y se guarda en una sola línea: name = put(ttk.Entry(form), 0). Por defecto lo estira ("ew"), pero las opciones y la casilla van a la izquierda ("w") y el botón, a la derecha ("e").
Aquí se juntan los componentes del curso: dos ttk.Entry rellenados con insert (el segundo con show="•"), un ttk.Combobox de solo lectura con current(0), tres Radiobutton que comparten la StringVar plan dentro de un marco y un Checkbutton con su BooleanVar.
register lee los datos con name.get(), plan.get() y country.get(). Si la casilla de las condiciones está marcada, da la bienvenida; si no, pide que se acepten. El mensaje va a la etiqueta status, que ocupa las dos columnas con columnspan=2.
Todo el formulario se puede diseñar en DMarlon Studio arrastrando desde la paleta el Campo de texto, la Contraseña, la Lista desplegable, las Opciones, la Casilla y el Botón; el estudio escribe el código de tkinter y usted solo rellena el método del botón.
Código · main.py
import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.title("Sign up")root.geometry("480x310")form = ttk.Frame(root, padding=(28, 18))form.pack(fill="both", expand=True)form.columnconfigure(1, weight=1) # column 1 grows with the windowfor r, text in enumerate(["Name:", "Password:", "Country:", "Plan:"]): # column 0 ttk.Label(form, text=text).grid(row=r, column=0, sticky="e", padx=(0, 10))def put(widget, row, sticky="ew"): # column 1: the widgets widget.grid(row=row, column=1, sticky=sticky, pady=5) return widgetname = put(ttk.Entry(form), 0)name.insert(0, "Linus Torvalds")put(ttk.Entry(form, show="•"), 1).insert(0, "kernel42")country = put(ttk.Combobox(form, values=["Finland", "Spain"], state="readonly"), 2)country.current(0)plan, plans = tk.StringVar(value="Pro"), put(ttk.Frame(form), 3, "w")for p in ("Free", "Pro", "Team"): ttk.Radiobutton(plans, text=p, value=p, variable=plan).pack(side="left", padx=(0, 12))terms = tk.BooleanVar(value=True)put(ttk.Checkbutton(form, text="I accept the terms", variable=terms), 4, "w")status = ttk.Label(form, text="Press Register to finish.", foreground="#475569")status.grid(row=6, column=0, columnspan=2, pady=14)def register(): ok = f"Welcome, {name.get()}! {plan.get()} plan, {country.get()}." status.config(text=ok if terms.get() else "Please accept the terms first.")put(ttk.Button(form, text="Register", command=register), 5, "e")root.mainloop()Para recordar
griden dos columnas es la forma clásica de un formulario.- Una función que coloca y devuelve el componente ahorra líneas.
- Cada dato se lee con
get()de su campo o de su variable. - Compruebe los datos antes de aceptarlos.
Ejercicio
Añada un campo «Email» y haga que register rechace el registro si el correo no contiene «@».