Виджет Progressbar предназначен для отображения хода выполнения какого-либо процесса. Основные параметры Progressbar:
-
value: текущее значение виджета (тип float)
-
maximum: максимальное значение (тип float)
-
variable: определяет переменную IntVar/DoublerVar, которая хранит текущее значение виджета
-
mode: определяет режим, принимает значения “determinate” (конечный) и “indeterminate” (бесконечный)
-
orient: определяет ориентацию виджета, принимает значения “vertical” (вертикальый) и “horizontal” (горизонтальный)
-
length: длина виджета (в пиксеоах)
Перед использованием этого виджета необходимо нго проинсталлировать в системе:
1 2 3 |
pip install progressbar (or) pip install progressbar2 |
Определим вертикальный и горизонтальный Progressbar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x150") # вертикальный Progressbar ttk.Progressbar(orient="vertical", length=100, value=40).pack(pady=5) # горизонтальный Progressbar ttk.Progressbar(orient="horizontal", length=150, value=20).pack(pady=5) root.mainloop() |
С помощью параметра variable можно привязать значение прогрессбара к переменной типа IntVar или DoublerVar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x150") value_var = IntVar(value=30) progressbar = ttk.Progressbar(orient="horizontal", variable=value_var) progressbar.pack(fill=X, padx=6, pady=6) label = ttk.Label(textvariable=value_var) label.pack(anchor=NW, padx=6, pady=6) root.mainloop() |
В данном случае значение прогрессбара привязано к переменной value_var, значение которой выводит метка label:
Методы Progressbar
Некоторые важные методы виджета:
-
start([interval])
: запускает перемещение индикатора через определенные интервалы времени. Каждый раз, когда пройдет очередной интервал, индикатор смещается на одно деление вперед. По умолчанию интервал равен 50 миллисекунд -
step([delta])
: увеличивает значение индикатора на значение из параметра delta (по умолчанию равен 1.0) -
stop()
: останавливает перемещение индикатора
Применим методы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x150") value_var = IntVar() progressbar = ttk.Progressbar(orient="horizontal", variable=value_var) progressbar.pack(fill=X, padx=6, pady=6) label = ttk.Label(textvariable=value_var) label.pack(anchor=NW, padx=6, pady=6) def start(): progressbar.start(1000) # запускаем progressbar def stop(): progressbar.stop() # останавливаем progressbar start_btn = ttk.Button(text="Start", command=start) start_btn.pack(anchor=SW, side=LEFT, padx=6, pady=6) stop_btn = ttk.Button(text="Stop", command=stop) stop_btn.pack(anchor=SE, side=RIGHT, padx=6, pady=6) root.mainloop() |
В данном случае по нажатию на кнопку start_btn запускаем перемещение индикатора – через каждые 1000 миллисекунд (1 секунду) индикатор перемещается на одно деление вперед. По нажатию на кнопку stop_btn останавливаем движение индекатора.
Режим прогрессбара
Параметр mode отвечает за установку режима прогрессбара и может принимать два значения:
-
"indeterminate"
: прогрессбар показывает индикатор, который перемещается без остановки между двумя краями виджета, то есть фактически бесконечно продолжает перемещение. Данный режим подходит, когда сложно расчитать, насколько должен перемещаться индикатор при отображении хода некоторой задачи -
"determinate"
: индикатор прогрессбара проходит от начала до конца и затем завершает перемещение. Значение по умолчанию. Подходит для отображения таких процессов, где можно подсчитать перемещение индикатора. Например, копируется 100 файлов, и, если параметрmaximum
равен 100, при копирования одного файла перемещаем индикатор на одно деление вперед.
Применение режима “determinate” по сути уже рассматривалось выше, так как это режим по умолчанию. Посмотрим на пример применения режима “indeterminate”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x150") progressbar = ttk.Progressbar(orient="horizontal", mode="indeterminate") progressbar.pack(fill=X, padx=10, pady=10) start_btn = ttk.Button(text="Start", command=progressbar.start) start_btn.pack(anchor=SW, side=LEFT, padx=10, pady=10) stop_btn = ttk.Button(text="Stop", command=progressbar.stop) stop_btn.pack(anchor=SE, side=RIGHT, padx=10, pady=10) root.mainloop() |
По нажатию на кнопку start_btn также запускается процесс. Когда индикатор дойдет до конца, он начинает обратное движение: