Чтобы получить фактические наборы утилит, нужно спуститься на один уровень ниже. Модуль в примере 10.6 определяет подклассы двух специфических по типу классов, наследующих класс ShellGui, чтобы предоставить наборы доступных инструментов в виде списка и словаря (обычно достаточно одного из них, но модуль иллюстрирует применение обоих). Кроме того, именно этот модуль запускает графический интерфейс — модуль shellgui является всего лишь библиотекой классов.
Пример 10.6. PP4E\Gui\ShellGui\mytools.py
#!/usr/local/bin/python
############################################################################## реализует два набора инструментов, специфичных для типов
##############################################################################
from shellgui import * # интерфейсы, специфичные для типов
from packdlg import runPackDialog # диалоги для ввода данных
from unpkdlg import runUnpackDialog # оба используют классы приложений
class TextPak1(ListMenuGui): def __init__(self):
self.myMenu = [(‘Pack ‘, runPackDialog), # простые функции (‘Unpack’, runUnpackDialog), # длина меток одинаковая (‘Mtool ‘, self.notdone)] # метод из GuiMixin
ListMenuGui.__init__(self) def forToolBar(self, label):
return label in {‘Pack ‘, ‘Unpack’} # синтаксис множеств в 3.x
class TextPak2(DictMenuGui): def __init__(self):
self.myMenu = {‘Pack ‘: runPackDialog, # или использовать input…
‘Unpack’: runUnpackDialog, # вместо диалогов ввода
‘Mtool ‘: self.notdone}
DictMenuGui.__init__(self)
if __name__ == ‘__main__’: # реализация самопроверки…
from sys import argv # ‘menugui.py list|~’
if len(argv) > 1 and argv[1] == ‘list’: print(‘list test’)
TextPak1().mainloop() else: print(‘dict test’)
TextPak2().mainloop()
Классы в этом модуле являются конкретными наборами утилит. Чтобы вывести другой набор имен утилит, нужно просто написать и использовать новый подкласс. Разделение логики приложения на такие отдельные подклассы и модули повышает возможность повторного использования программного обеспечения.
На рис. 10.5 изображено главное окно ShellGui, создаваемое при запуске сценария mytools с классом структуры меню на основе списка в Windows 7, а также оторванные меню, демонстрирующие свое содержание. Меню и панель инструментов этого окна построены с помощью класса GuiMaker, а кнопки Quit и Help и пункты меню, вызывающие методы quit и help, унаследованы из класса GuiMixin через суперклассы Shell— Gui модуля. Надеюсь, вы начинаете понимать, почему в этой книге столь часто проповедуется повторное использование программного кода?
Рис. 10.5. Элементы mytools в окне ShellGui
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011