Для обеспечения большей независимости в примере 8.34 каждая из демонстрационных панелей запускается, как независимая программа (процесс), с помощью модуля launchmodes, который мы написали в конце главы 5. Это работает потому, что все демонстрационные примеры были написаны и как импортируемые классы, и как выполняемые сценарии. При запуске их таким образом каждая из них получает имя __main__, потому что являются отдельными, независимыми программами; а это, в свою очередь, приводит к запуску mainloop в конце каждого файла.
Пример 8.34. PP4E\Gui\Tour\demoAll-prg.py
4 демонстрационных класса, выполняемых как независимые процессы: команды; если теперь одно окно будет завершено щелчком на кнопке Quit, остальные продолжат работу; в данном случае не существует простого способа вызвать все методы report (впрочем, для организации взаимодействий между процессами можно было бы воспользоваться сокетами и каналами), а кроме того, некоторые способы запуска могут сбрасывать поток stdout дочерних программ и разрывать связь между родителем и потомком;
from tkinter import *
from PP4E.launchmodes import PortableLauncher
demoModules = [‘demoDlg’, ‘demoRadio’, ‘demoCheck’, ‘demoScale’]
for demo in demoModules: # смотрите главу 5
PortableLauncher(demo, demo + ‘.py’)() # запуск в виде программ верхнего # уровня
root = Tk()
root.title(‘Processes’)
Label(root, text=’Multiple program demo: command lines’, bg=’white’).pack() root.mainloop()
Перед запуском этого сценария убедитесь, что корневой каталог с примерами PP4E находится в пути поиска модулей (например, включен в переменную окружения PYTHONPATH) — он импортирует модуль из другого подкаталога. Как видно из рис. 8.35, создаваемый данным сценарием интерфейс аналогичен предыдущему — все четыре демонстрации появляются в собственных окнах.
Однако на этот раз окна действительно являются независимыми программами: при завершении любого из пяти имеющихся окон остальные продолжают работу. Демонстрационные программы будут выполняться, даже если закрыть окно родительского процесса. В Windows окно командной строки, откуда был запущен этот сценарий, снова становится активным и готовым для ввода следующей команды, притом, что дочерние программы продолжают выполняться. Здесь мы повторно использовали программный код демонстрационных примеров, запуская их как самостоятельные программы, а не как модули.
Рис. 8.35. demoAll_prg: независимые программы
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011