Сценарий PyDemos создает панель с кнопками, которые запускают программы в демонстрационном режиме — не для повседневного применения. Я использую PyDemos, когда мне необходимо показать программы Python, — гораздо проще нажимать на кнопки, чем набирать командные строки или искать сценарии с помощью проводника по файловой системе.
Вы можете использовать PyDemos (и PyGadgets) для запуска и опробования примеров, представленных в этой книге, — все кнопки в этом графическом интерфейсе представляют примеры, с которыми мы познакомимся в последующих главах. Однако если вы соберетесь использовать сценарии Launch_PyDemos и Launch_PyGadgets_bar, находящиеся в корневом каталоге с примерами, не забудьте включить в переменную окружения PYTHONPATH путь к каталогу PP4E — они не предусматривают автоматическую настройку вашей системы или путей поиска модулей.
Чтобы пользоваться этой панелью запуска было еще легче, перетащите ее на рабочий стол Windows, создав ярлык, на котором можно щелкнуть мышью (нечто подобное можно проделать и на других системах). Так как в этом сценарии жестко определены команды для запуска программ, находящихся в других подкаталогах в дереве примеров, он также полезен как предметный указатель к главным примерам из книги. На рис. 10.17 показано, как выглядит интерфейс сценария PyDemos при выполнении в Windows, наряду с несколькими демонстрационными программами, которые он запускает; PyDemos — это вертикальная панель с кнопками. В Linux он выглядит несколько иначе, но действует так же.
Рис. 10.17. PyDemos c несколькими демонстрационными программами
Исходный программный код, с помощью которого создается такая картина, приводится в примере 10.30 (его начало может несколько отличаться от того, что изображено на рис. 10.17, из-за мелких изменений, которые разработчики так любят вносить в последний момент). Сценарий PyDemos не содержит ничего особенного с точки зрения программирования графических интерфейсов, поэтому большая его часть не вошла в листинг — полную реализацию вы найдете в пакете с примерами.
В двух словах, функция demoButton в нем просто прикрепляет к главному окну новую кнопку, готовую при нажатии запустить программу на языке Python. Для запуска программ сценарий PyDemos вызывает экземпляр объекта launchmodes.PortableLauncher, с которым мы познакомились в конце главы 5, — поскольку здесь он выступает в роли обработчика tkinter, для запуска программы используется операция вызова функции.
Как показано на рис. 10.17, сценарий PyDemos создает также два всплывающих окна, когда нажимаются кнопки в нижней части главного окна, — окно Info содержит краткое описание последней запущенной демонстрационной программы, а окно Links содержит переключатели, нажатие которых открывает связанные с книгой сайты в локальном веб-броузере:
• Всплывающее окно Info отображает простую строку сообщения и раз в секунду изменяет ее шрифт, чтобы привлечь к себе внимание. Поскольку это может раздражать, всплывающее окно сначала появляется в свернутом виде (щелкните на кнопке Info, чтобы увидеть его или спрятать).
• Переключатели всплывающего окна Links своим поведением напоминают гиперссылки на веб-странице, но этот графический интерфейс на является броузером: при щелчке на них, с помощью сценария LaunchBrowser, упоминавшегося во второй части книги, отыскивается и запускается веб-броузер, подключающийся к соответствующему сайту при наличии соединения с Интернетом. Этот модуль в свою очередь использует современный модуль webbrowser из стандартной библиотеки Python.
• Чтобы ко всем окнам этого сценария привязать ярлык с синими буквами «PY» вместо стандартных красных букв «Tk», используется модуль windows, написанный нами ранее в этой главе.
В графическом интерфейсе сценария PyDemos также присутствуют кнопки code, расположенные правее кнопок с именами демонстрационных программ. Щелчок на этих кнопках открывает файлы с исходными текстами соответствующих примеров. Файлы открываются в текстовом редакторе PyEdit, с которым мы встретимся в главе 11. На рис. 10.18 изображены некоторые из окон с исходными текстами с несколько измененными размерами.
Для примеров, демонстрирующих работу с Интернетом, которые запускаются последними двумя кнопками на панели, выполняется попытка запустить локальный веб-сервер, обеспечивающий работу демонстрационных программ, не показанных здесь (мы встретимся с сервером в главе 15). В этом издании веб-серверы запускаются, только когда впервые выполняется щелчок на кнопке того или иного примера, демонстрирующего работу с Интернетом (а не при запуске PyDemos). При запуске веб-сервера в Windows открывается окно консоли, в которое выводятся сообщения о состоянии сервера.
PyDemos работает в Windows, Mac и в Linux в основном благодаря присущей переносимости Python и tkinter. Дополнительные подробности можно найти в исходных текстах, частично представленных в примере 10.30.
![]() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![]() |
|||
![]() |
New in version 2.1 (4E)
-updated to run under Python 3.X (3.1)
-added "grep" search menu option and dialog: threaded external f. -verify app exit on quit if changes in other edit windows in proc -supports arbitrary Unicode encodings for files: per textConfig. | -update change and font dialog implementations to allow many to 1
Пример 10.30. PP4E\PyDemos.pyw (external)
############################################################################## PyDemos.pyw
Программирование на Python, 2, 3 и 4 издания (PP4E), 2001—2006—2010
Версия 2.1 (4E), апрель, 2010: добавлена возможность выполнения под управлением Python 3.X и запуск локальных веб-серверов при первой попытке запустить пример, демонстрирующий работу с Интернетом.
Версия 2.0 (3E), март, 2006: добавлены кнопки просмотра исходных текстов примеров; добавлены новые демонстрационные программы (PyPhoto, PyMailGUI); предусмотрен запуск локальных веб-серверов для демонстрационных примеров, использующих веб-броузер; добавлены ярлыки окон; и, наверное, еще что-то, о чем я забыл.
Запускает основные примеры графических интерфейсов Python+Tk из книги независимым от платформы способом. Этот файл может также служить предметным указателем к основным примерам программ, хотя многие примеры в книге не имеют графического интерфейса и потому здесь не перечислены. Смотрите также:
— PyGadgets.py, более простой сценарий запуска программ в недемонстрационном режиме, который можно использовать для повседневной работы
— PyGadgets_bar.pyw, создает панель с кнопками для запуска всех программ PyGadgets по отдельности, а не всех сразу
— Launcher.py позволяет запускать программы без настройки окружения -отыскивает Python, устанавливает PYTHONPATH и так далее.
— Launch_*.pyw, запускает PyDemos и PyGadgets с помощью Launcher.py -попробуйте запустить их для беглого знакомства
— LaunchBrowser.pyw, открывает веб-страницы примеров в веб-броузере, обнаруживаемом автоматически
— README—PP4E.txt, общая информация о примерах
ВНИМАНИЕ: эта программа пытается автоматически запускать локальный веб-сервер
и веб-броузер для демонстрационных примеров работы с Интернетом, но не завершает работу сервера.
##############################################################################
…часть программного кода опущена: смотрите файлы в дереве примеров…
##############################################################################
— начало создания главных окон графического интерфейса
##############################################################################
from PP4E.Gui.Tools.windows import MainWindow # Tk с ярлыком, заголовком,
# кнопкой закрытия
from PP4E.Gui.Tools.windows import PopupWindow # То же, но Toplevel,
# отличается действием
# кнопки закрытия
Root = MainWindow(‘PP4E Demos 2.1’)
# создать окно сообщений
Stat = PopupWindow(‘PP4E demo info’)
Stat.protocol(‘WM_DELETE_WINDOW’, lambda:0) # игнорировать событие
Info = Label(Stat, text = ‘Select demo’,
font=(‘courier’, 20, ‘italic’), padx=12, pady=12, bg=’lightblue’)
Info.pack(expand=YES, fill=BOTH)
##############################################################################
# добавить кнопки запуска с объектами обработчиков
##############################################################################
from PP4E.Gui.TextEditor.textEditor import TextEditorMainPopup
# класс механизма запуска демонстрационных программ
class Launcher(launchmodes.PortableLauncher): # использовать имеющийся класс
def announce(self, text): # настроить метку в интерфейсе
Info.config(text=text)
def viewer(sources):
for filename in sources:
TextEditorMainPopup(Root, filename, # как всплывающее окно loadEncode=’utf-8’) # иначе PyEdit может выводить # запросы для каждого!
def demoButton(name, what, doit, code):
добавляет кнопки, которые выполняют команды doit и открывают все файлы в списке code; кнопка doit сохраняет информацию в объекте, а кнопка code — в объемлющей области видимости;
rowfrm = Frame(Root)
rowfrm.pack(side=TOP, expand=YES, fill=BOTH)
b = Button(rowfrm, bg=’navy’, fg=’white’, relief=RIDGE, border=4) b.config(text=name, width=20, command=Launcher(what, doit)) b.pack(side=LEFT, expand=YES, fill=BOTH)
b = Button(rowfrm, bg=’beige’, fg=’navy’)
b.config(text=’code’, command=(lambda: viewer(code)))
b.pack(side=LEFT, fill=BOTH)
############################################################################## # демонстрационные программы с графическим интерфейсом tkinter — некоторые
# используют сетевые соединения
##############################################################################
demoButton(name=’PyEdit’,
what=’Text file editor’, # редактировать
doit=’Gui/TextEditor/textEditor.py PyDemos.pyw’, # предполагается code=[‘launchmodes.py’, # в тек. раб. кат.
‘Tools/find.py’, ‘Gui/Tour/scrolledlist.py’, # вывести в PyEdit ‘Gui/ShellGui/formrows.py’, # последний = верхний в стопке ‘Gui/Tools/guimaker.py’,
‘Gui/TextEditor/textConfig.py’, ‘Gui/TextEditor/textEditor.py’])
demoButton(name=’PyView’,
what=’Image slideshow, plus note editor’, doit=’Gui/SlideShow/slideShowPlus.py Gui/gifs’, code=[‘Gui/Texteditor/textEditor.py’,
‘Gui/SlideShow/slideShow.py’, ‘Gui/SlideShow/slideShowPlus.py’])
…часть программного кода опущена: смотрите файлы в дереве примеров…
############################################################################## # переключение шрифта в окне Info раз в секунду ##############################################################################
def refreshMe(info, ncall):
slant = [‘normal’, ‘italic’, ‘bold’, ‘bold italic’][ncall % 4] info.config(font=(‘courier’, 20, slant)) Root.after(1000, (lambda: refreshMe(info, ncall+1)) )
############################################################################## # показать/спрятать окно Info в случае щелчка на кнопке Info ##############################################################################
Stat.iconify() def onInfo(): if Stat.state() == ‘iconic’:
Stat.deiconify()
else:
Stat.iconify() # было ‘normal’
############################################################################## # конец создания графического интерфейса, запуск цикла события
##############################################################################
def onLinks():
…часть программного кода опущена: смотрите файлы в дереве примеров…
Button(Root, text=’Info’, command=onInfo).pack(side=TOP, fill=X) Button(Root, text=’Links’, command=onLinks).pack(side=TOP, fill=X) Button(Root, text=’Quit’, command=Root.quit).pack(side=BOTTOM, fill=X) refreshMe(Info, 0) # запустить переключение шрифтов в окне Info Root.mainloop()
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011