Уничтожение событий выполняет связанную функцию 5 раз - PullRequest
0 голосов
/ 10 октября 2019

У меня есть некоторый код на python, использующий модуль tkinter. Я пытался связать функцию с "<Destroy>", но каждый раз, когда я запускаю код и закрываю окно, связанная функция выполняется 5 раз. Вот код:

def bind_events(self):
        ''' binding the events to their functions '''

        self.master.bind("<Destroy>", lambda x: print("OK"))

Этот код является функцией класса. Затем на выходе я получаю это:

>>> OK
OK
OK
OK
OK

Есть ли какое-то решение для этой проблемы. Спасибо за ваше время и извините за мой английский.

1 Ответ

2 голосов
/ 10 октября 2019

Если вы связываете событие с корневым окном, эта привязка прикрепляется к каждому виджету. Таким образом, если у вас есть корневое окно с четырьмя другими виджетами, то при уничтожении окна связанная функция будет вызываться пять раз - один раз для каждого виджета.

Простой способ убедиться в этом - изменить свою функцию. не просто печатать «ОК», но также печатать виджет, связанный с событием:

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)
...