Виджет флажка, шкалы с ползунком и списка в Tkinter

В 3-ей части уроков по изучению Tkinter мы расскажем о базовых виджетах.

Содержание курса

  1. Создание окна по центру и кнопка выхода в Tkinter
  2. Разметка виджетов в Tkinter — pack, grid и place
  3. Виджеты Checkbutton, Label, Scale и Listbox в Tkinter
  4. Меню, подменю и панель инструментов в Tkinter
  5. Диалоговые окна в Tkinter
  6. Рисуем линии, прямоугольники, круг и текст в Tkinter
  7. Пишем игру змейка на 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.

Флажки в Tkinter checkbox

Виджет 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()

Наш пример показывает изображение в окне.

Виджет ярлыка в Tkinter

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 для хранения и отображается в яврлыке как текст.

шкала с ползунком в 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. Выбранная актриса из списка отображается в виджете ярлыка как текст.

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

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

Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.

E-mail: vasile.buldumac@ati.utm.md

Образование
Universitatea Tehnică a Moldovei (utm.md)

  • 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
  • 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»