Обобщенный графический интерфейс инструментов оболочки

obobshhennyj graficheskij interfejs instrumentov obolochki Приемы программирования графических интерфейсов

Примеры с 10.5 по 10.11 — два сценария командной строки, один вспомогательный модуль для реализации графического интерфейса, два диалога, главный графический интерфейс и модуль формы ввода параметров — представляют конкретную реализацию этих абстрактных размышлений. Так как я хотел, чтобы это был инструмент общего назначения, способный запустить любую программу командной строки, его конструкция разбита на модули, которые становятся все более специфическими для приложений по мере углубления в иерархию программного обеспечения. А на самом верху все должно быть максимально универсальным, как показано в примере 10.5.

Пример 10.5. PP4E\Gui\ShellGui\shellgui.py

#!/usr/local/bin/python

############################################################################## инструмент запуска; использует шаблоны GuiMaker, стандартный диалог завершения GuiMixin; это просто библиотека классов: чтобы вывести графический интерфейс, запустите сценарий mytools;

##############################################################################

подпись: импортировать виджеты импортировать quit, а не done конструктор меню/панелиfrom tkinter import * #

from PP4E.Gui.Tools.guimixin import GuiMixin #

from PP4E.Gui.Tools.guimaker import * #

# инструментов

class ShellGui(GuiMixin, GuiMakerWindowMenu): # фрейм + конструктор +

def start(self): # подмешиваемые методы

self.setMenuBar() # для компонентов использовать

self.setToolBar() # GuiMaker

self.master.title(“Shell Tools Listbox”)

self.master.iconname(“Shell Tools”)


подпись: def fortoolbar(self, label) подпись: # поместить на панель инстр.?



подпись: return true# по умолчанию = все

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 и DictMenuGui, находящиеся в этом же файле, чтобы получить список имен утилит через их методы fetchCommands и управлять операциями по именам с помощью их методов runCommand. Эти два подкласса в действительности лишь предоставляют интерфейс к наборам утилит, представленным в виде списков и словарей, — они по-прежнему не знают, какие имена утилит будут реально отображены в графическом интерфейсе. Это сделано умышленно: так как отображаемые наборы утилит определяются подклассами более низкого уровня, мы получаем возможность использовать класс ShellGui для отображения различных наборов утилит.

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

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