В примере 14.1 приводится файл, который запускает программу Py- MailGUI. Он реализует окна верхнего уровня со списками сообщений — комбинацию прикладной логики PyMailGUI и суперклассов оконного протокола, реализованных ранее в этой книге. Эти суперклассы определяют заголовки окон, значки и поведение при закрытии.
Кроме того, в этом модуле находится основная документация для разработчиков и логика обработки параметров командной строки — программа принимает из командной строки имена одного или более файлов с сохраненной в них почтой и автоматически открывает их при запуске графического интерфейса. Эта особенность, например, используется панелью запуска PyDemos, представленной в главе 10.
Пример 14.1. PP4E\Internet\Email\PyMailGui\PyMailGui.py
############################################################################ PyMailGui 3.0 — почтовый клиент Python/tkinter.
Клиентский графический интерфейс на базе tkinter для отправки и приема электронной почты.
Смотрите строку с текстом справки в PyMailGuiHelp.py, где приводится информация об использовании, и список предлагаемых расширений этой версии.
Версия 2.0 была полностью переписана. Изменения между версиями 2.0 (июль 2005) и 2.1 (январь 2006): кнопки быстрого доступа в окнах просмотра, выполнение в потоках операций загрузки и удаления сообщений в локальных файлах, проверка и восстановление синхронизации с почтовым ящиком на сервере по номерам сообщений при удалении, загрузке оглавления и загрузке сообщений.
Версия 3.0 (4E) является результатом переноса для работы под управлением Python 3.X; использует компоновку по сетке вместо фреймов колонок для улучшения размещения полей заголовков в окнах просмотра; вызывает метод update() после вставки нового текстового редактора, чтобы обеспечить более точное позиционирование текстового курсора (смотрите изменения метода loadFirst в PyEdit, в главе 11); предоставляет HTML-версию текста справки; извлекает простой текст из основных частей в формате HTML для отображения и цитирования; поддерживает разделители в панелях инструментов; решает проблему выбора кодировки для тела сообщения и заголовков при получении, отправке и сохранении почты (см. главы 13 и 14); и многое другое (см. главу 14, где приводится полный перечень изменений в версии 3.0); декодирование полученного сообщения выполняется глубоко в недрах пакета mailtools, при выполнении операций загрузки в кэш; кроме того, пакет mailtools исправляет некоторые ошибки пакета email (см. главу 13);
Этот файл реализует окна верхнего уровня и интерфейс. PyMailGui использует ряд модулей, которые ничего не подозревают об этом графическом интерфейсе, но решают свои задачи, часть из которых была реализована в других разделах книги. Модуль mailconfig расширен для использования в этой программе.
==Модули, определяемые в другом месте и используемые здесь:==
mailtools (пакет)
глава, посвященная созданию клиентских сценариев
отправляет на сервер и принимает с сервера, анализирует, конструирует (пример 13.21+)
threadtools.py
глава об инструментах графического интерфейса
управление очередью обработчиков графического интерфейса (пример 10.20) windows.py
глава об инструментах графического интерфейса
настройка рамок окон верхнего уровня (пример 10.16)
textEditor.py
глава с примерами программ с графическим интерфейсом
текстовый виджет, используемый в окнах просмотра сообщений, некоторые диалоги (пример 11.4)
==В целом полезные модули, определяемые здесь:==
popuputil.py
диалог с текстом справки и диалоги с информацией о ходе
выполнения операций для общего использования
messagecache.py
кэш для слежения за уже загруженными сообщениями
wraplines.py
утилита переноса длинных строк в сообщениях
html2text.py
упрощенный механизм преобразования HTML в простой текст
mailconfig.py
пользовательские параметры: имена серверов, шрифты и так далее
==Модули программы, определяемые здесь:==
SharedNames.py
объекты, совместно используемые классами окон и главным файлом ViewWindows.py
реализация окон просмотра, создания, ответа и пересылки ListWindows.py
реализация окон со списками содержимого почтового ящика
на сервере и локальных файлов
PyMailGuiHelp.py (see also PyMailGuiHelp.html)
текст справки для пользователя, который выводится щелчком
на полосе вызова справки в главном окне
PyMailGui.py
главный файл верхнего уровня (запускает программу) с типами главного окна ############################################################################
import mailconfig, sys
from SharedNames import appname, windows
from ListWindows import PyMailServer, PyMailFile
############################################################################ # классы окон верхнего уровня
#
# Все окна просмотра, создания, ответа, пересылки, справки и диалоги
# с информацией о ходе выполнения операции являются прямыми наследниками
# класса PopupWindow: только используется; askPasswordWindow вызывает
# конструктор PopupWindow и прикрепляет виджеты к полученному окну;
# порядок здесь имеет большое значение! — классы PyMail переопределяют
# некоторые методы по умолчанию в классах окон, такие как destroy
# и okayToExit: они должны указываться первыми;
# чтобы использовать PyMailFileWindow отдельно, необходимо
# имитировать логику PyMailCommon.onOpenMailFile;
############################################################################
# использует файл значка в cwd или в каталоге по умолчанию tools
srvrname = mailconfig.popservername or ‘Server’
class PyMailServerWindow(PyMailServer, windows.MainWindow):
"окно Tk с расширенным протоколом и подмешанными методами"
def __init__(self):
windows.MainWindow.__init__(self, appname, srvrname) PyMailServer.__init__(self)
class PyMailServerPopup(PyMailServer, windows.PopupWindow):
"окно Toplevel с расширенным протоколом и подмешанными методами"
def __init__(self):
windows.PopupWindow.__init__(self, appname, srvrnane) PyMailServer.__init__(self)
class PyMailServerComponent(PyMailServer, windows.ComponentWindow): "фрейм Frame с расширенным протоколом и подмешанными методами"
def __init__(self):
windows.ComponentWindow.__init__(self) PyMailServer.__init__(self)
class PyMailFileWindow(PyMailFile, windows.PopupWindow):
"окно Toplevel с расширенным протоколом и подмешанными методами"
def __init__(self, filename):
windows.PopupWindow.__init__(self, appname, filename) PyMailFile.__init__(self, filename)
############################################################################ # когда выполняется как программа верхнего уровня: создает главное окно
# со списком сообщений на сервере
############################################################################
if __name__ == ‘__main__’:
rootwin = PyMailServerWindow() # открыть окно для сервера
if len(sys.argv) > 1: # 3.0: исправ. для добавл. len()
for savename in sys.argv[1:]:
rootwin.onOpenMailFile(savename) # открыть окна # для файлов (демо) rootwin.lift() # сохранить файлы, загруженные
rootwin.mainloop() # в потоках
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011