Автор оригинала: 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!
Для получения дополнительных аргументов и настроек этого виджета вы можете ознакомиться с официальной документацией .
Давайте теперь посмотрим на виджет индикатора выполнения!
Использование виджета 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()
Выход
Вы получаете движущийся индикатор прогресса!
Это увеличивает значение
от 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, который иллюстрирует, что программа работает.
Вывод
Наконец, мы подошли к концу нашего урока по использованию Tkinter Spinbox и виджетов Progressbar. Надеюсь, вы поняли шаги, чтобы добавить больше функциональности в ваше графическое приложение!
Скоро появится больше контента Tkinter, так что следите за обновлениями!