# по умолчанию = все
def setToolBar(self):
self.toolBar = []
for (label, action) in self.fetchCommands():
if self.forToolBar(label):
self.toolBar.append((label, action, dict(side=LEFT)))
self.toolBar.append((‘Quit’, self.quit, dict(side=RIGHT)))
def setMenuBar(self)
toolEntries = []
self.menuBar = [
(‘File’, 0, [(‘Quit’, -1, self.quit)]), # имя раскрывающегося меню
(‘Tools’, 0, toolEntries) # список элементов меню
] # метка,клавиша,обработчик
for (label, action) in self.fetchCommands():
toolEntries.append((label, -1, action)) # добавить приложения # в меню
##############################################################################
# делегирование операций шаблонным подклассам с разным способом хранения
# перечня утилит, которые в свою очередь делегируют операции
# подклассам, реализующим запуск утилит
##############################################################################
class ListMenuGui(ShellGui):
def fetchCommands(self): # myMenu устанавливается в подклассе
return self.myMenu # список кортежей (метка, обработчик)
def runCommand(self, cmd):
for (label, action) in self.myMenu: if label == cmd: action()
class DictMenuGui(ShellGui):
def fetchCommands(self):
return self.myMenu.items()
def runCommand(self, cmd):
self.myMenu[cmd]()
Класс ShellGui, находящийся в этом модуле, знает, как с помощью интерфейсов GuiMaker и GuiMixin создать окно для выбора, которое выводит имена утилит в меню, в списке с прокруткой и на панели инструментов. Он также предоставляет переопределяемый метод forToolBar, позволяющий подклассам указывать, какие утилиты должны добавляться на панель инструментов, а какие — нет (на панели инструментов может быстро закончиться свободное место). Однако он умышленно оставлен в неведении относительно имен утилит, которые должны быть выведены в указанных местах, и операций, которые должны быть выполнены при выборе имен утилит.
Вместо этого класс ShellGui использует подклассы ListMenuGui и DictMenu— Gui, находящиеся в этом же файле, чтобы получить список имен утилит через их методы fetchCommands и управлять операциями по именам с помощью их методов runCommand. Эти два подкласса в действительности лишь предоставляют интерфейс к наборам утилит, представленным в виде списков и словарей, — они по-прежнему не знают, какие имена утилит будут реально отображены в графическом интерфейсе. Это сделано умышленно: так как отображаемые наборы утилит определяются подклассами более низкого уровня, мы получаем возможность использовать класс ShellGui для отображения различных наборов утилит.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011