DMarlon Studio

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.

tkinter · Barras de progreso en DMarlon Studio: el código del ejemplo y la ventana que abre al ejecutarlo

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: value sobre maximum.
  • variable= une la barra a una IntVar.
  • Indeterminado: start(ms) para moverla y stop() 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().