Lección 7 · 7 de 20
Casillas de verificación · tkinter
Casillas de tkinter (Checkbutton), cada una con su BooleanVar: unas marcadas al empezar y un resumen que cambia con cada clic.

Un Checkbutton es una casilla que se marca y se desmarca. Su estado vive en una variable: aquí, una `BooleanVar`, que vale True si está marcada y False si no.
El diccionario toppings dice qué casillas empiezan marcadas. El bucle crea para cada ingrediente tk.BooleanVar(value=checked) y la casilla con variable=choices[name]. Las variables se guardan en el diccionario choices para leerlas después: si una variable de tkinter se pierde, la casilla se queda sin estado.
command=update se llama con cada clic. update recorre choices, se queda con los nombres cuyo var.get() es True y los une con ", ".join(...); si no hay ninguno, escribe none.
La etiqueta summary se crea antes del bucle para que update pueda usarla, pero se coloca con pack después, debajo de las casillas: lo que decide la posición es el orden de pack, no el de creación.
En DMarlon Studio es la Casilla de la paleta: en el inspector se pone su texto y si empieza *Marcada*. El estudio la une a una IntVar llamada self.<Nombre>_var, que vale 1 si está marcada y 0 si no.
Código · main.py
import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.title("Pizza toppings")root.geometry("400x270")ttk.Label(root, text="Choose your toppings", font=("Helvetica", 16, "bold")).pack(anchor="w", padx=24, pady=(20, 8))summary = ttk.Label(root, foreground="#1d4ed8")toppings = {"Cheese": True, "Mushrooms": False, "Olives": True, "Pepperoni": False, "Pineapple": False}choices = {} # name -> BooleanVardef update(): chosen = [name for name, var in choices.items() if var.get()] summary.config(text="Selected: " + (", ".join(chosen) or "none"))# One BooleanVar per checkbox: True while it is checked.for name, checked in toppings.items(): choices[name] = tk.BooleanVar(value=checked) ttk.Checkbutton(root, text=name, variable=choices[name], command=update).pack(anchor="w", padx=36, pady=2)summary.pack(anchor="w", padx=24, pady=14)update()root.mainloop()Para recordar
- Cada casilla tiene su propia variable (
BooleanVaroIntVar). - El valor inicial de la variable decide si empieza marcada.
commandse llama cada vez que se marca o se desmarca.- Guarde las variables: si se pierden, la casilla se queda sin estado.
Ejercicio
Añada un precio a cada ingrediente y muestre en el resumen el total de los que estén marcados.