Флажки

flazhki Экскурсия по tkinter, часть 1

Виджеты Checkbutton и Radiobutton предусматривают возможность ассоциирования с переменными tkinter: щелчок на виджете изменяет значение переменной, а изменение значения переменной изменяет со
стояние виджета, к которому она привязана. В действительности переменные tkinter составляют функциональную основу этих графических элементов:

     Группа флажков Checkbutton реализует интерфейс с выбором нескольких вариантов путем присвоения каждому виджету (флажку) собственной переменной.

     Группа переключателей Radiobutton реализует модель выбора единственного из нескольких взаимоисключающих вариантов путем придания каждому виджету уникального значения и назначения одной и той же переменной tkinter.

У обоих типов виджетов есть параметры command и variable. Параметр command позволяет зарегистрировать обработчик, который вызывается, как только возникает событие щелчка на виджете, подобно обычным виджетам Button. Но передавая переменную tkinter в параметре variable, можно также в любой момент получать или изменять состояние виджета путем получения или изменения значения связанной с ним переменной.

Флажки tkinter несколько проще в обращении, поэтому с них и начнем. Пример 8.22 создает группу из пяти флажков, изображенную на рис. 8.26. Для большей пользы он также добавляет кнопку, с помощью которой выводится текущее состояние всех флажков, и прикрепляет экземпляр кнопки Quitter, которую мы создали в начале главы.


Рис. 8.26. Сценарий demoCheck в действии

 


 


Пример 8.22. PP4E\Gui\Tour\demoCheck.py

“создает группу флажков, которые вызывают демонстрационные диалоги”

#   подпись: from tkinter import *
from dialogtable import demos from quitter import quitter
импортировать базовый набор виджетов

#   импортировать готовые диалоги

#   прикрепить к “себе” объект Quitter

class Demo(Frame):

def __init__(self, parent=None, **options): Frame.__init__(self, parent, **options) self.pack()

self.tools()

Label(self, text=”Check demos”).pack() self.vars = [] for key in demos: var = IntVar() Checkbutton(self, text=key, variable=var, command=demos[key]).pack(side=LEFT) self.vars.append(var)

def report(self):

for var in self.vars:

print(var.get(), end=’ ‘) # текущие значения флажков: 1 или 0 print()

def tools(self):

frm = Frame(self)

frm.pack(side=RIGHT)

Button(frm, text=’State’, command=self.report).pack(fill=X) Quitter(frm).pack(fill=X)

if __name__ == ‘__main__’: Demo().mainloop()

С точки зрения программного кода, флажки похожи на обычные кнопки, они даже добавляются в контейнерный виджет. Однако функционально они несколько отличаются. Как можно видеть по рисунку (а лучше — запустив пример), флажок работает как переключатель: щелчок на нем изменяет его состояние из выключенного во включенное (из невыбранного в выбранное) или обратно — из включенного в выключенное. Когда флажок выбран, на нем выводится галочка, а связанная с ним переменная IntVar получает значение 1; когда он не выбран, галочка исчезает, а его переменная IntVar получает значение 0.

Чтобы смоделировать приложение, содержащее флажки, кнопка State в этом графическом интерфейсе запускает метод report в сценарии, который выводит текущие состояния всех пяти флажков в поток stdout. Ниже приводится вывод, полученный после нескольких щелчков:

C:\\PP4E\Gui\Tour> python demoCheck.py 0 0 0 0 0

1 0 0 0 0

1 0 1 0 0

1 0 1 1 0

1 0 0 1 0

1 0 0 1 1

В действительности это значения пяти переменных tkinter, ассоциированных с флажками Checkbutton посредством параметров variable, и при опросе они совпадают со значениями виджетов. В этом сценарии с каждым из флажков Checkbutton на экране ассоциирована переменная IntVar, поскольку это двоичные индикаторы, способные принимать значение 0 или 1. Переменные StringVar тоже можно использовать, но при этом их методы будут возвращать строки ‘0’ или ‘1’, а не целые числа, а их начальным состоянием будет пустая строка (а не целое число 0).

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

Интересно, что вызвать метод report можно также в интерактивном сеансе. При работе в таком режиме виджеты отображаются во всплывающем окне при вводе строк и полностью действуют даже без вызова функции mainloop:

C:\\PP4E\Gui\Tour> python

>>> from demoCheck import Demo

>>> d = Demo()

>>> d.report() 0 0 0 0 0

>>> d.report()

1 0 0 0 0

>>> d.report()

1 0 0 1 1

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий