В 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?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
В нашем примере мы поместили флажок в окно. Использование этого флажка позволяет скрыть или отобразить заголовок окна.
1 |
self.var = BooleanVar() |
Мы создали BooleanVar объект. Данные объекты позволяют хранить логические значения виджетов в Tkinter.
1 |
cb = Checkbutton(self, text="Показать заголовок", variable=self.var, command=self.onClick) |
Создается экземпляр Checkbutton. Объект, хранящий значение, соединяется с виджетом посредством параметра variable. Когда мы нажимаем на флажок, вызывается метод onClick()
. Для этого также используется параметр command.
1 |
cb.select() |
Изначально, заголовок окна виден. Поэтому, мы делаем флажок включенным с помощью метода select().
1 2 3 4 |
if self.var.get(): self.master.title("Checkbutton") else: self.master.title("") |
Внутри метода onClick() мы отображаем или скрываем заголовок окна, основываясь на значении из переменной self.var.
Виджет Label (ярлык) пример кода Tkinter
Виджет 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() |
Наш пример показывает изображение в окне.
1 |
from PIL import Image, ImageTk |
По умолчанию, виджет Label может отображать ограниченное количество форматов изображений. Чтобы отобразить JPG изображение, необходимо использовать библиотеку PIL (Python Imaging Library модуль).
1 2 |
self.img = Image.open("tatras.jpg") tatras = ImageTk.PhotoImage(self.img) |
Мы создаем изображение из файла изображения в текущей рабочей директории. После этого мы создаем фото изображение из изображения.
1 |
label = Label(self, image=tatras) |
Фотоизображению присваивается параметр image виджета ярлыка.
1 |
label.image = tatras |
Чтобы сборщик мусора не закрыл наше изображение, нам необходимо сохранить ссылку на него.
1 2 |
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. Значение из виджета шкалы отображается в виджете ярлыка.
1 2 |
scale = Scale(self, from_=0, to=100, command=self.onScale) |
Мы создаем виджет Scale. Также мы указываем границы шкалы от 0 до 100. В Python слово from это зарезервированное ключевое слово, поэтому необходимо прописывать символ подчеркивание (_) после параметра. Когда мы двигаем ползунок по шкале, вызывается метод onScale().
1 2 |
self.var = IntVar() self.label = Label(self, text=0, textvariable=self.var) |
Создается переменная для хранения целого значения из шкалы и виджет ярлыка. Значение из переменной val
будет отображаться в ярлыке.
1 2 3 |
def onScale(self, val): v = int(float(val)) self.var.set(v) |
Метод onScale() получает текущее выбранное значение из виджета шкалы как параметр. Значение сначала конвертируется в тип float (число с плавающей запятой), после чего конвертируется в тип integer (целое число). В результате, значение передается в self.var
для хранения и отображается в яврлыке как текст.
Виджет Listbox — Список в Tkinter
Виджет 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. Выбранная актриса из списка отображается в виджете ярлыка как текст.
1 2 3 4 |
acts = [ 'Скарлетт Йоханссон', 'Рэйчел Вайс', 'Натали Портман', 'Джессика Альба' ] |
Это весь список актрис, которые будут показаны в списке.
1 2 3 |
lb = Listbox(self) for i in acts: lb.insert(END, i) |
Мы создаем экземпляр Listbox и добавляем в него все объекты из указанного выше списка.
1 |
lb.bind("<<ListboxSelect>>", self.onSelect) |
Когда мы выбираем на элемент из списка, генерируется событие <<ListboxSelect>>
. Мы закрепляем метод onSelect() к этому событию.
1 2 |
self.var = StringVar() self.label = Label(self, text=0, textvariable=self.var) |
Мы создаем ярлык и держатель его значения self.var
. С помощью этого ярлыка мы будем отображать выбранный на текущий момент элемент из списка.
1 |
sender = val.widget |
Мы получаем отправителя события – это наш виджет списка.
1 |
idx = sender.curselection() |
Мы узнаем индекс выбранного элемента из списка при помощи метода curselection().
1 |
value = sender.get(idx) |
Фактическое значение извлекается при помощи метода get(), который получает индекс элемента из списка.
1 |
self.var.set(value) |
В результате, текста ярлыка обновляется и отображается имя выбранной актрисы.
В этой части обучения Tkinter мы рассказали о базовых виджетах и попробовали с ними взаимодействовать.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»