Если вы связываете событие с корневым окном, эта привязка прикрепляется к каждому виджету. Таким образом, если у вас есть корневое окно с четырьмя другими виджетами, то при уничтожении окна связанная функция будет вызываться пять раз - один раз для каждого виджета.
Простой способ убедиться в этом - изменить свою функцию. не просто печатать «ОК», но также печатать виджет, связанный с событием:
self.master.bind("<Destroy>", lambda event: print("{}: OK".format(event.widget)))
Это связано с тем фактом, что вы фактически не привязываетесь к виджету per se, вы привязываетесь к привязывающему тегу , имя которого совпадает с именем виджета. Каждый виджет имеет набор связанных с ним тегов привязки в дополнение к себе:
- Он будет иметь тег привязки для себя
- Он будет иметь тег привязки для класса виджета (вот как виджеты получают поведение по умолчанию)
- У него будет тег привязки для окна верхнего уровня (или корня) для этого виджета,
- У него будет специальный тег привязки "все"
Таким образом, когда вы привязываетесь к корневому окну, любой виджет будет наследовать эту привязку. Если вы хотите привязать к корневому окну и только к корневому окну, наиболее распространенным решением является привязка к функции, а в этой функции только действие виджета - это корневое окно.
Например,:
def on_destroy(self, event):
if event.widget == self.master:
print("{}: OK".format(event.widget))
self.master.bind("<Destroy>", self.on_destroy)