Lección 6 · 6 de 20
Barras de progreso · tkinter
Muestre el avance de una tarea con ttk.Progressbar de tkinter: modo determinado con valor y máximo, modo indeterminado y barras verticales.

ttk.Progressbar tiene dos modos. En el determinado (el de serie) enseña cuánto se ha hecho: maximum=100 es el total y el valor, la parte hecha. Aquí el valor vive en una IntVar (variable=copied), así que basta con cambiar la variable para mover la barra; también vale bar["value"] = 65.
step(10) suma 10 al valor; el botón +10 lo usa y actualiza el texto «65 of 100 files». Al pasar del máximo, la barra vuelve a empezar desde cero, así que en un programa real se comprueba antes de llegar al final.
El modo indeterminado (mode="indeterminate") no sabe cuánto falta: un bloque va y viene mientras se espera. start(15) lo mueve cada 15 milisegundos y stop() lo para. Es para búsquedas o conexiones de duración desconocida.
Con orient="vertical" la barra crece hacia arriba; length es su largo en píxeles, en las dos orientaciones. Las cuatro del final, con valores 30, 80, 55 y 100, parecen un medidor de niveles.
En DMarlon Studio es la Barra de progreso de la paleta: su valor, su máximo, el modo y la orientación se cambian en el inspector, y el estudio escribe el ttk.Progressbar.
Código · main.py
import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.title("Progress")root.geometry("460x290")# Determinate: value goes from 0 to maximum.copied = tk.IntVar(value=65)ttk.Label(root, text="Copying files").pack(anchor="w", padx=24, pady=(20, 4))bar = ttk.Progressbar(root, variable=copied, maximum=100, length=410)bar.pack()done = ttk.Label(root, text="65 of 100 files")done.pack(anchor="e", padx=24)def more(): # step() adds to the value (and wraps round after maximum) bar.step(10) done.config(text=f"{copied.get()} of 100 files")ttk.Button(root, text="+10", command=more).pack(anchor="e", padx=20)# Indeterminate: a block that moves back and forth while we wait.ttk.Label(root, text="Searching for updates…").pack(anchor="w", padx=24, pady=(8, 4))busy = ttk.Progressbar(root, mode="indeterminate", length=410)busy.pack()busy.start(15) # it moves every 15 ms; busy.stop() stops it# orient="vertical": the bar grows upwards.levels = ttk.Frame(root)levels.pack(anchor="w", padx=20, pady=(16, 0))for value in (30, 80, 55, 100): ttk.Progressbar(levels, orient="vertical", value=value, length=60).pack(side="left", padx=4)root.mainloop()Para recordar
- Determinado:
valuesobremaximum. variable=une la barra a unaIntVar.- Indeterminado:
start(ms)para moverla ystop()para pararla. orient="vertical"la pone de pie.
Ejercicio
Haga que el botón solo sume si el valor es menor que 100 y que, al llegar a 100, pare la barra indeterminada con stop().