Программирование, обеспечивающее повторное использование

programmirovanie obespechivajushhee povtornoe ispolzovanie Экскурсия по tkinter, часть 1

Постскриптум: я реализовал все демонстрационные панели запуска, разворачиваемые в четырех последних примерах так, чтобы продемонстрировать различные способы использования их виджетов. Они разрабатывались без учета возможности многократного их использования — на самом деле они не слишком полезны вне контекста знакомства с виджетами в данной книге.

Так было задумано — большинством графических элементов tkinter легко пользоваться после изучения их интерфейсов, а библиотека tkinter в значительной мере сама обеспечивает значительную гибкость настройки. Но если бы я задумал реализовать классы флажков и переключателей, которые можно повторно использовать как универсальные библиотечные компоненты, их нужно было бы структурировать иным образом:

Лишние виджеты

Они не должны выводить ничего, кроме переключателей и флажков. В существующем виде в каждый демонстрационный пример для иллюстрации встроены кнопки State и Quit, но в действительности у каждого окна верхнего уровня должна быть только одна кнопка Quit.

Управление компоновкой

Они должны допускать различное расположение кнопок и вообще никак не компоновать себя (ни методом pack, ни методом grid). В по- настоящему универсальных реализациях для повторного использования часто лучше передоверить вызывающей программе самой управлять размещением компонентов.

Ограничения режима использования

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

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

Пример 8.36. PP4E\Gui\Tour\buttonbars.py

классы панелей флажков и переключателей для приложений, которые запрашивают информацию о состоянии позднее;

передается список вариантов выбора, вызывается метод state(), работа с переменными выполняется автоматически

from tkinter import *

class Checkbar(Frame):

def __init__(self, parent=None, picks=[], side=LEFT, anchor=W): Frame.__init__(self, parent) self.vars = [] for pick in picks:

var = IntVar() chk = Checkbutton(self, text=pick, variable=var) chk.pack(side=side, anchor=anchor, expand=YES) self.vars.append(var) def state(self):

return [var.get() for var in self.vars]

class Radiobar(Frame): def __init__(self, parent=None, picks=[], side=LEFT, anchor=W):

Frame.__init__(self, parent) self.var = StringVar() self.var.set(picks[0]) for pick in picks:

rad = Radiobutton(self, text=pick, value=pick, variable=self.var) rad.pack(side=side, anchor=anchor, expand=YES) def state(self):

return self.var.get()

if __name__ == ‘__main__’: root = Tk() lng = Checkbar(root, [‘Python’, ‘C#’, ‘Java’, ‘C++’]) gui = Radiobar(root, [‘win’, ‘x11’, ‘mac’], side=TOP, anchor=NW) tgl = Checkbar(root, [‘All’])

gui.pack(side=LEFT, fill=Y) lng.pack(side=TOP, fill=X) tgl.pack(side=LEFT) lng.config(relief=GROOVE, bd=2) gui.config(relief=RIDGE, bd=2)

def allstates(): print(gui.state(), lng.state(), tgl.state())

from quitter import Quitter Quitter(root).pack(side=RIGHT) Button(root, text=’Peek’, command=allstates).pack(side=RIGHT) root.mainloop()

Для повторного использования этих классов в сценариях нужно импортировать их и вызвать со списком вариантов выбора, которые должны появиться на панелях флажков или переключателей. Программный код самотестирования модуля, находящийся в конце, демонстрирует особенности использования этих классов. Если запустить этот пример как самостоятельный сценарий, на экране появится окно верхнего уровня, изображенное на рис. 8.36, с двумя встроенными панелями Checkbar, одной панелью Radiobar, кнопкой Quitter для завершения, а также кнопкой Peek для вывода информации о состоянии панелей.

Рис. 8.36. Окно самотестирования сценария buttonbars

 

Ниже приводится содержимое стандартного потока вывода stdout после щелчка на кнопке Peek — результат вызова методов state этих классов:

x11 [1, 0, 1, 1] [0] win [1, 0, 0, 1] [1]

Два класса из этого модуля демонстрируют, насколько просто создаются оболочки интерфейсов tkinter, облегчающие их использование, — они полностью скрывают замысловатые особенности реализации панелей переключателей и флажков. Например, при использовании таких классов высокого уровня можно полностью забыть о том, как нужно использовать связанные переменные, — достаточно просто создать объекты со списками вариантов выбора и затем вызывать их методы state. Если пойти этим путем до конца, можно прийти к библиотеке виджетов более высокого уровня, такой как пакет Pmw, упоминавшийся в главе 7.

С другой стороны, эти классы все же не готовы для универсального применения. Например, если потребуется выполнять действия при выборе вариантов, придется использовать другие интерфейсы верхнего уровня. К счастью, Python/tkinter предоставляют великое их множество. Далее в этой книге мы снова будем пользоваться комбинациями виджетов и снова будем применять приемы, представленные в этой главе, для создания более крупных графических интерфейсов. А сейчас последняя остановка в этой первой главе, посвященной экскурсии по виджетам, — фотолаборатория.

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

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