Виджеты 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
“создает группу флажков, которые вызывают демонстрационные диалоги”
#
импортировать базовый набор виджетов
# импортировать готовые диалоги
# прикрепить к “себе” объект 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