Прежде чем двинуться дальше, необходимо сказать несколько слов о событии <Destroy> (регистр символов в имени которого имеет значение): это событие генерируется, когда выполняется операция уничтожения виджета, будь то вызов метода из сценария или операция закрытия окна пользователем, включая завершение программы. Если привязать обработчик этого события к окну, он будет вызываться по одному разу для каждого виджета в окне — атрибут widget объекта события, передаваемого обработчику в виде аргумента, будет ссылаться на уничтожаемый виджет, и вы можете использовать эту особенность, чтобы определить момент уничтожения какого-то определенного виджета. Если же привязать этот обработчик к какому-то определенному виджету, он будет вызываться только при уничтожении этого виджета.
Важно знать, что в момент возбуждения события виджет находится в «полумертвом» состоянии (в терминологии библиотеки Tk) — он по- прежнему существует, но большинство операций над ним будут терпеть неудачу. По этой причине событие <Destroy> вообще не может использоваться для выполнения операций с графическим интерфейсом — например, попытки проверки признака изменения состояния виджета или извлечения его содержимого в обработчике события <Destroy> будут возбуждать исключения. Кроме того, в этом обработчике нельзя отменить уничтожение виджетов и обеспечить продолжение работы графического интерфейса. Если вам потребуется перехватывать и проверять или подавлять операцию закрытия окна после щелчка пользователем на кнопке X окна, используйте событие WM_DELETE_WINDOW в методе protocol высокого уровня, как было описано выше в этой главе.
Кроме того, вы должны знать, что вызов метода quit виджетов не возбуждает никаких событий <Destroy>, а наличие любых зарегистрированных обработчиков события <Destroy> в программах, выполняемых под управлением Python 3.X, вообще приводит к фатальной ошибке при завершении программы. Вследствие этого программы, привязывающие обработчики этого события для выполнения заключительных действий, не связанных с графическим интерфейсом, должны обычно вызывать метод destroy вместо quit и надеяться, что программа завершится вместе с уничтожением последнего или единственного корневого окна Tk (созданного явно или по умолчанию), как описывалось выше. Это обстоятельство препятствует использованию метода quit для немедленного завершения программы, хотя у вас всегда остается последнее средство — функция sys.exit.
Сценарий может также выполнять заключительные операции в программном коде, следующем за вызовом функции mainloop, но к этому моменту графический интерфейс уже будет полностью уничтожен, и данный программный код не может быть привязан к какому-то конкретному виджету. Мы еще будем говорить об этом событии, когда будем изучать программу PyEdit в главе 11 — мы найдем это событие непригодным для проверки наличия изменений в тексте, определяющих необходимость его сохранения.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011