Рубрики
Без рубрики

Виджеты Tkinter Spinbox и Progressbar

Привет всем! В этой серии уроков по Tkinter мы узнаем о виджетах Tkinter Spinbox и Progressbar. Мы продолжим изучение других виджетов

Автор оригинала: Pankaj Kumar.

Привет всем! В этой серии уроков по Tkinter мы узнаем о виджетах Tkinter Spinbox и Progressbar. Мы продолжим изучение дополнительных виджетов, которые мы можем добавить в наше приложение.

Давайте рассмотрим каждый из них по очереди, используя наглядные примеры!

Использование виджета Tkinter Spinbox

Виджет Tkinter Spinbox – это виджет, который позволяет нам выбирать из фиксированного набора значений.

Помните виджет ввода Tkinter ? Предположим, вы хотите ограничить выбор конечного пользователя только ограниченным набором вариантов, это не очень полезно здесь!

Вы бы предпочли фиксированный набор опций на выбор, и это действительно то, что дает нам виджет Spinbox!

Давайте рассмотрим его использование сейчас.

Это почти то же самое, что и наш виджет ввода , но вы указываете список значений в необязательном аргументе values , который является кортежем .

spin_box = tk.Spinbox(master, values)

Вы также можете указать из диапазона значений, используя аргументы from_ и to , если ваши значения находятся между целыми числами/и т. Д.

ПРИМЕЧАНИЕ : Аргумент ключевого слова from_ имеет подчеркивание в конце, так как from является зарезервированным ключевым словом Python.

spin_box = tk.Spinbox(master, from_, to)

Давайте теперь сделаем простое приложение, которое имеет виджет spinbox с некоторыми предопределенными опциями.

Мы будем использовать диспетчер геометрии сетки, чтобы разместить наши виджеты в подходящих местах.

Мы также дадим каждому виджету метку, чтобы другие могли идентифицировать его с помощью некоторого текста.

import tkinter as tk

# Create the master object
master = tk.Tk()

# Create a spinbox widget
spinbox_1 = tk.Spinbox(master, values=("Python", "Java", "C++"))

# And a label for it
label_1 = tk.Label(master, text="Language")

# Create another spinbox widget
spinbox_2 = tk.Spinbox(master, from_=1, to=3)

# And a label for it
label_2 = tk.Label(master, text="Value")

# Use the grid geometry manager to put the widgets in the respective position
label_1.grid(row=0, column=0)
spinbox_1.grid(row=0, column=1)

label_2.grid(row=1, column=0)
spinbox_2.grid(row=1, column=1)

# The application mainloop
tk.mainloop()

Выход

Запись в Spinbox 1
Запись Spinbox 2

Если вы запустите это самостоятельно, вы увидите, что вы можете настроить значения из конкретного списка, который мы предоставили выше, для обоих виджетов spinbox!

Для получения дополнительных аргументов и настроек этого виджета вы можете ознакомиться с официальной документацией .

Давайте теперь посмотрим на виджет индикатора выполнения!

Использование виджета Progressbar

Виджет Индикатор выполнения показывает состояние любой длительной операции.

Предположим, что вы хотите визуализировать, сколько времени занимает прогресс чего-либо, вы можете сделать это с помощью Progressbar!

Это доступно в модуле tkinter.ttk , поэтому вы должны импортировать его отдельно.

import tkinter as tk
# Necessary for the Progressbar widget
import tkinter.ttk as ttk

Мы рассмотрим его использование с помощью простых опций. Вы можете посмотреть полный список здесь .

progress_bar = ttk.Progressbar(orient, mode, maximum, value)

Здесь orient указывает ориентацию индикатора выполнения. Он может быть как “горизонтальным”, так и “вертикальным”

Виджет может работать в двух режимах с:

  • “Определить” -> Показывает количество выполненных работ относительно общего объема работ
  • “Неопределенный” -> Просто показывает анимированный дисплей, чтобы показать, что работа продолжается.

Индикатор выполнения будет продолжаться до тех пор, пока текущее значение бара не достигнет максимума .

Чтобы начать увеличивать значение progressbar, мы должны использовать progress_bar.start(interval) , который автоматически делает это для вас каждые интервал миллисекунды.

Мы сохраним это значение в None , и оно будет установлено на значение по умолчанию 50 миллисекунд

progress_bar.start(interval=None)

Теперь мы убедимся , что значение увеличивается на количество , используя метод step () .

progress_bat.step(amount=10)

Я опубликую полный код до сих пор.

import tkinter as tk
import tkinter.ttk as ttk

# Create the master object
master = tk.Tk()

# Create a progressbar widget
progress_bar = ttk.Progressbar(master, orient="horizontal",
                              mode="determinate", maximum=100, value=0)

# And a label for it
label_1 = tk.Label(master, text="Progress Bar")


# Use the grid manager
label_1.grid(row=0, column=0)
progress_bar.grid(row=0, column=1)

# Start auto-incrementing periodically
progress_bar.start()
progress_bar.step(10)

# The application mainloop
tk.mainloop()

Выход

Индикатор выполнения 1

Вы получаете движущийся индикатор прогресса!

Это увеличивает значение от 0 до 100 каждые 50 миллисекунд на 10 единиц.

Но используем ли мы правильный подход?

Но проблема здесь в том, что индикатор выполнения снова сбрасывается на 0 после достижения максимума .

Чтобы избежать этого, мы должны остановить() индикатор выполнения.

Но я понял, что это также создало больше проблем, чем я думал, так как тогда я не смог получить индикатор выполнения обновления.

Самая большая проблема заключается в том, что наше основное приложение работает в функции tk.mainloop () . Таким образом, все это должно быть предварительно рассчитано для работы в режиме реального времени.

Итак, после нескольких поисков в Google я обнаружил, что использование start() и stop() является НЕ правильным способом, поскольку он никогда не говорит о том, как перерисовывается панель прогресса.

Поэтому единственное оставшееся решение (к сожалению) – вручную обновить значение индикатора выполнения самостоятельно.

И это действительно похоже на вывод, к которому пришли другие программисты Tkinter, увидев контент в сообщениях StackOverflow. Давайте теперь продолжим!

Измените значения виджета самостоятельно

Для этого все виджеты Tkinter имеют атрибуты словаря, которые мы можем изменить! Да, все очень просто.

Просто обновите значение progressbar, используя:

progress_bar['value'] = 0
master.update()

Однако мы также должны сообщить объекту master , что этот виджет обновляется с новым значением, используя master.update() .

Теперь мы перепишем наш старый и неправильный код, чтобы учесть эти изменения.

import tkinter as tk
import tkinter.ttk as ttk
import time

# Create the master object
master = tk.Tk()

# Create a progressbar widget
progress_bar = ttk.Progressbar(master, orient="horizontal",
                              mode="determinate", maximum=100, value=0)

# And a label for it
label_1 = tk.Label(master, text="Progress Bar")


# Use the grid manager
label_1.grid(row=0, column=0)
progress_bar.grid(row=0, column=1)

# Necessary, as the master object needs to draw the progressbar widget
# Otherwise, it will not be visible on the screen
master.update()

progress_bar['value'] = 0
master.update()

while progress_bar['value'] < 100:
    progress_bar['value'] += 10
    # Keep updating the master object to redraw the progress bar
    master.update()
    time.sleep(0.5)
    
# The application mainloop
tk.mainloop()

Теперь, когда мы сами выполняем всю тяжелую работу по обновлению значений виджетов, у нас больше контроля.

Теперь этот код должен иметь возможность отображать непрерывную последовательность индикатора выполнения, останавливаясь, когда значение достигает 100.

Вот простой GIF, который иллюстрирует, что программа работает.

Индикатор выполнения 4

Вывод

Наконец, мы подошли к концу нашего урока по использованию Tkinter Spinbox и виджетов Progressbar. Надеюсь, вы поняли шаги, чтобы добавить больше функциональности в ваше графическое приложение!

Скоро появится больше контента Tkinter, так что следите за обновлениями!