Виджет флажка, шкалы с ползунком и списка в Tkinter
В 3-ей части уроков по изучению Tkinter мы расскажем о базовых виджетах.
Содержание курса
- Создание окна по центру и кнопка выхода в Tkinter
- Разметка виджетов в Tkinter — pack, grid и place
- Виджеты Checkbutton, Label, Scale и Listbox в Tkinter
- Меню, подменю и панель инструментов в Tkinter
- Диалоговые окна в Tkinter
- Рисуем линии, прямоугольники, круг и текст в Tkinter
- Пишем игру змейка на Tkinter
Содержание статьи
- Виджет Checkbutton — Флажок ВКЛ/ВЫКЛ
- Виджет Label (ярлык) пример кода Tkinter
- Виджет Scale — шкала с ползунком в Tkinter
- Виджет Listbox — Список в Tkinter
В рамках урока мы будем работать с виджетами:
- Checkbutton (флажок);
- Label (ярлык);
- Scale (шкала с ползунком);
- Listbox (список).
Виджеты – это базовые блоки для создания графического интерфейса программы. За годы развития программирования некоторые из виджетов стали стандартными во всех языках и на всех платформах.
Например, это виджеты кнопок, флажки или полоса прокрутки. Некоторые из виджетов могут иметь другие названия. Например, классические флажки (check box) в Tkinter имеют название Checkbutton.
В Tkinter реализован небольшой набор виджетов, который покрывает базовые нужды программирования. Дополнительные виджеты могут быть созданы самостоятельно.
Виджет Checkbutton — Флажок ВКЛ/ВЫКЛ
Checkbutton – это виджет, который имеет два состояния: «включен» и «выключен». Состояние «включен» визуально символизируется соответствующей отметкой (Некоторые темы могут иметь разные визуальные отметки). Виджет используется для обозначения каких-либо логических свойств. Виджет Checkbutton имеет флажок с текстовым ярлыком.
|
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 26 27 28 29 30 31 32 33 34 |
from tkinter import Tk, Frame, Checkbutton from tkinter import BooleanVar, BOTH class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Флажки") self.pack(fill=BOTH, expand=True) self.var = BooleanVar() cb = Checkbutton(self, text="Показать заголовок", variable=self.var, command=self.onClick) cb.select() cb.place(x=50, y=50) def onClick(self): if self.var.get(): self.master.title("Флажки") else: self.master.title("") def main(): root = Tk() root.geometry("250x150+300+300") app = Example() root.mainloop() if __name__ == '__main__': main() |
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
В нашем примере мы поместили флажок в окно. Использование этого флажка позволяет скрыть или отобразить заголовок окна.
Мы создали BooleanVar объект. Данные объекты позволяют хранить логические значения виджетов в Tkinter.
cb = Checkbutton(self, text="Показать заголовок", variable=self.var, command=self.onClick) |
Создается экземпляр Checkbutton. Объект, хранящий значение, соединяется с виджетом посредством параметра variable. Когда мы нажимаем на флажок, вызывается метод onClick(). Для этого также используется параметр command.
Изначально, заголовок окна виден. Поэтому, мы делаем флажок включенным с помощью метода select().
if self.var.get(): self.master.title("Checkbutton") else: self.master.title("") |
Внутри метода onClick() мы отображаем или скрываем заголовок окна, основываясь на значении из переменной self.var.
Виджет Label используется для того, чтобы отображать текст или изображения. С этим виджетом пользователи никак не могут взаимодействовать.
В данном примере используется дополнительный файл:
Сохраните изображение рядом с файлом label.py, код для которого предоставлен ниже.
|
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
from PIL import Image, ImageTk from tkinter import Tk from tkinter.ttk import Frame, Label import sys class Example(Frame): def __init__(self): super().__init__() self.loadImage() self.initUI() def loadImage(self): try: self.img = Image.open("tatras.jpg") except IOError: print("Возникла ошибка во время открытия изображения!") sys.exit(1) def initUI(self): self.master.title("Ярлык") tatras = ImageTk.PhotoImage(self.img) label = Label(self, image=tatras) # Сохраняем ссылку на объект открытого изображения. label.image = tatras label.pack() self.pack() def setGeometry(self): w, h = self.img.size self.master.geometry(("%dx%d+300+300") % (w, h)) def main(): root = Tk() ex = Example() ex.setGeometry() root.mainloop() if __name__ == '__main__': main() |
Наш пример показывает изображение в окне.

from PIL import Image, ImageTk |
По умолчанию, виджет Label может отображать ограниченное количество форматов изображений. Чтобы отобразить JPG изображение, необходимо использовать библиотеку PIL (Python Imaging Library модуль).
self.img = Image.open("tatras.jpg") tatras = ImageTk.PhotoImage(self.img) |
Мы создаем изображение из файла изображения в текущей рабочей директории. После этого мы создаем фото изображение из изображения.
label = Label(self, image=tatras) |
Фотоизображению присваивается параметр image виджета ярлыка.
Чтобы сборщик мусора не закрыл наше изображение, нам необходимо сохранить ссылку на него.
w, h = self.img.size self.parent.geometry(("%dx%d+300+300") % (w, h)) |
Мы устанавливаем размер окна таким образом, чтобы максимально точно подобрать его под размеры изображения.
Виджет Scale — шкала с ползунком в Tkinter
Scale – это виджет, который позволяет пользователю графически выбирать значение, перемещая определенный ползунок по ограниченной линии. В нашем примере выбранное значение ползунком будет отображено виджетом ярлыка в формате текста.
|
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 26 27 28 29 30 31 32 33 34 35 36 37 |
from tkinter import Tk, BOTH, IntVar, LEFT from tkinter.ttk import Frame, Label, Scale, Style class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Шкала с ползунком") self.style = Style() self.style.theme_use("default") self.pack(fill=BOTH, expand=1) scale = Scale(self, from_=0, to=100, command=self.onScale) scale.pack(side=LEFT, padx=15) self.var = IntVar() self.label = Label(self, text=0, textvariable=self.var) self.label.pack(side=LEFT) def onScale(self, val): v = int(float(val)) self.var.set(v) def main(): root = Tk() ex = Example() root.geometry("250x100+300+300") root.mainloop() if __name__ == '__main__': main() |
В нашем скрипте присутствует два виджета: scale и label. Значение из виджета шкалы отображается в виджете ярлыка.
scale = Scale(self, from_=0, to=100, command=self.onScale) |
Мы создаем виджет Scale. Также мы указываем границы шкалы от 0 до 100. В Python слово from это зарезервированное ключевое слово, поэтому необходимо прописывать символ подчеркивание (_) после параметра. Когда мы двигаем ползунок по шкале, вызывается метод onScale().
self.var = IntVar() self.label = Label(self, text=0, textvariable=self.var) |
Создается переменная для хранения целого значения из шкалы и виджет ярлыка. Значение из переменной val будет отображаться в ярлыке.
def onScale(self, val): v = int(float(val)) self.var.set(v) |
Метод onScale() получает текущее выбранное значение из виджета шкалы как параметр. Значение сначала конвертируется в тип float (число с плавающей запятой), после чего конвертируется в тип integer (целое число). В результате, значение передается в self.var для хранения и отображается в яврлыке как текст.
Виджет Listbox позволяет отображать список объектов. Он позволяет пользователю выбирать один или несколько элементов из списка.
|
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
from tkinter import Tk, BOTH, Listbox, StringVar, END from tkinter.ttk import Frame, Label class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title("Список в Tkinter") self.pack(fill=BOTH, expand=1) acts = [ 'Скарлетт Йоханссон', 'Рэйчел Вайс', 'Натали Портман', 'Джессика Альба' ] lb = Listbox(self) for i in acts: lb.insert(END, i) lb.bind("<<ListboxSelect>>", self.onSelect) lb.pack(pady=15) self.var = StringVar() self.label = Label(self, text=0, textvariable=self.var) self.label.pack() def onSelect(self, val): sender = val.widget idx = sender.curselection() value = sender.get(idx) self.var.set(value) def main(): root = Tk() ex = Example() root.geometry("300x250+300+300") root.mainloop() if __name__ == '__main__': main() |
В нашем примере мы отображаем список актрис, используя Listbox. Выбранная актриса из списка отображается в виджете ярлыка как текст.
acts = [ 'Скарлетт Йоханссон', 'Рэйчел Вайс', 'Натали Портман', 'Джессика Альба' ] |
Это весь список актрис, которые будут показаны в списке.
lb = Listbox(self) for i in acts: lb.insert(END, i) |
Мы создаем экземпляр Listbox и добавляем в него все объекты из указанного выше списка.
lb.bind("<<ListboxSelect>>", self.onSelect) |
Когда мы выбираем на элемент из списка, генерируется событие <<ListboxSelect>>. Мы закрепляем метод onSelect() к этому событию.
self.var = StringVar() self.label = Label(self, text=0, textvariable=self.var) |
Мы создаем ярлык и держатель его значения self.var. С помощью этого ярлыка мы будем отображать выбранный на текущий момент элемент из списка.
Мы получаем отправителя события – это наш виджет списка.
idx = sender.curselection() |
Мы узнаем индекс выбранного элемента из списка при помощи метода curselection().
Фактическое значение извлекается при помощи метода get(), который получает индекс элемента из списка.
В результате, текста ярлыка обновляется и отображается имя выбранной актрисы.

В этой части обучения Tkinter мы рассказали о базовых виджетах и попробовали с ними взаимодействовать.

Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»

