Сценарий gui1 является тривиальным примером, но он иллюстрирует шаги, которые выполняются большинством программ, использующих библиотеку tkinter. Этот сценарий делает следующее:
1. Загружает класс виджета из модуля tkinter’
2. Создает экземпляр импортированного класса Label’
3. Упаковывает (размещает) новый объект Label в его родительском элементе*
4. Вызывает функцию mainloop, чтобы показать окно и начать цикл событий tkinter*
Метод mainloop, вызываемый последним, помещает метку на экран и входит в состояние ожидания, в котором отслеживаются события графического интерфейса, генерируемые пользователем. Внутри функции mainloop библиотека tkinter следит за такими вещами, как клавиатура или мышь, чтобы обнаружить порожденные пользователем события. Функционально функция mainloop в библиотеке tkinter напоминает следующий псевдокод:
def mainloop():
пока главное окно не закрыто: если возникло событие: вызвать соответствующий обработчик
В этой модели вызов mainloop в примере 7.1 никогда не вернет управление сценарию, пока графический интерфейс отображается на экране.[XXVI] Как мы увидим, добравшись до больших сценариев, единственным способом выполнять какие-либо операции после вызова mainloop является регистрация обработчиков обратного вызова, реагирующих на события. Это называется разработкой программ, управляемых событиями, и, возможно, это один из самых необычных аспектов графических интерфейсов. Программы с графическим интерфейсом принимают форму набора обработчиков событий, которые совместно используют хранящуюся информацию, а не линейного потока выполнения. Как это выглядит в действующем программном коде, мы увидим в последующих примерах.
Обратите внимание, что для создания графического интерфейса в этом сценарии действительно необходимо выполнить шаги 3 и 4. А чтобы отобразить окно, нужно вызвать mainloop — для вывода виджетов внутри окна они должны быть скомпонованы (то есть размещены), чтобы менеджер компоновки tkinter знал о них. На самом деле, если вызвать только mainloop или только pack, не вызывая второго из них, окно будет показывать не то, что нужно: mainloop без pack выведет пустое окно, а pack без mainloop не выведет ничего, потому что сценарий не войдет в состояние ожидания событий (можете попробовать). Иногда вызывать функцию mainloop необязательно, например, при программировании в интерактивной оболочке, но в общем случае вам не следует полагаться на это.
Поскольку понятия, иллюстрируемые этим простым примером, лежат в центре большинства программ tkinter, рассмотрим их несколько глубже, прежде чем двинуться дальше.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011