В простых примерах с кнопкой из предыдущего раздела обработчиком событий служила уже существующая функция, завершающая программу. Однако ничуть не сложнее зарегистрировать собственный обработчик, который выполняет что-нибудь более полезное. В примере 7.12 определяется собственный обработчик обратного вызова на языке Python.
Пример 7.12. PP4E\Gui\Intro\gui3.py
import sys
from tkinter import *
def quit(): # собственный обработчик событий
print(‘Hello, I must be going…’) sys.exit() # закрыть окно и завершить процесс
widget = Button(None, text=’Hello event world’, command=quit) widget.pack() widget.mainloop()
Окно, создаваемое этим сценарием, изображено на рис. 7.11. Этот сценарий и воспроизводимый им графический интерфейс почти совпадают с предыдущим примером. Но здесь в параметре command передается функция, которая определена локально. При нажатии кнопки библиотека tkinter вызовет для обработки события функцию quit в этом файле. Внутри quit вызов функции print выведет сообщение в поток stdout программы, и процесс завершится, как ранее.
Рис. 7.11. Кнопка, нажатие на которую вызывает функцию Python
Как обычно, роль потока вывода stdout играет окно, из которого была запущена программа, если только он не был перенаправлен в файл.
Это будет всплывающее окно консоли DOS, если запустить программу щелчком на файле в Windows; добавьте вызов input перед sys.exit, если всплывающее окно исчезает прежде чем удается посмотреть сообщение. Ниже показано, как выглядит вывод в стандартный поток вывода при нажатии кнопки — он генерируется функцией на языке Python, которую автоматически вызывает библиотека tkinter:
C:\…\PP4E\Gui\Intro> python gui3.py Hello, I must be going…
C:\…\PP4E\Gui\Intro>
Обычно такие сообщения должны выводиться в графическом интерфейсе, но мы еще не добрались до того, как это сделать. Конечно, функции обратного вызова обычно выполняют больше действий (и могут даже вызывать появление новых независимых окон), но основы их использования продемонстрированы в данном примере.
Вообще говоря, обработчиками событий могут быть любые вызываемые объекты — функции; анонимные функции, создаваемые с помощью lambda-выражений; связанные методы классов или экземпляров типов или экземпляры классов, наследующие метод перегрузки оператора __call__. Обработчики нажатия кнопки Button не получают никаких аргументов (кроме self, который автоматически передается связанным методам) — любые данные, необходимые обработчику события, должны быть доступны другими способами: в виде глобальных переменных, атрибутов экземпляра класса, дополнительных аргументов, передаваемых косвенным путем, и так далее.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011