Как вы уже догадались, необходимо соблюдать осторожность при уничтожении объектов пользовательского интерфейса из собственных обработчиков событий. Мало того, что текущий обработчик событий все еще активен, но могут быть другие ожидающие события, которые все еще находятся в очереди, и если целевой объект был уничтожен при их доставке, вы можете получить сбой.
Лучшее, что нужно сделать, это отложить уничтожение до тех пор, пока не будут выполнены текущие и возможные обработчики обработанных событий, и нет ничего ожидающего, что это будет сделано для объекта пользовательского интерфейса, кроме уничтожения, которое вы хотите сделать. И лучший способ сделать это - использовать wx.CallAfter
. Он вызывается функцией с параметрами, которые вы даете ей в следующий раз, когда цикл событий опустеет, поэтому неявно нет ничего другого, ожидающего выполнения или отправки объекту пользовательского интерфейса.
В вашем случае было бы безопасно делать такие вещи, как сразу же удалить страницу из ноутбука и скрыть окно страницы. Затем используйте wx.CallAfter
для вызова некоторой функции (возможно, в классе ноутбука), которая вызывает метод Destroy
окна страницы и выполняет любую другую очистку, которая необходима. Причина, по которой я предлагаю расщепить эти два набора задач, заключается не в том, что для вызова функции потребуется много времени, но в некоторых случаях она может быть достаточно длинной, чтобы мгновенно мерцать в переходном состоянии, поэтому внешний вид менее плавный для пользователей.