При привязке к виджету Toplevel
привязка применяется к этому виджету и всем его потомкам .Если вы хотите, чтобы событие обрабатывалось только виджетом Toplevel
, общее решение заключается в проверке объекта виджета, связанного с событием.
Например, вы можете использовать winfo_toplevel()
, чтобы получить виджет верхнего уровня, связанный с любым заданным виджетом, и выполнять свое действие, только если виджет, связанный с событием, совпадает с окном верхнего уровня, связанным с событием.
Например:
def save_attr(self, event):
if event.widget == event.widget.winfo_toplevel():
...
Причина этого заключается в том, как обрабатываются события.Когда вы привязываете события к виджетам, вы фактически не привязываетесь к виджету.Вместо этого вы привязываетесь к привязывающему тегу , имя которого совпадает с внутренним именем виджета.Когда событие обрабатывается, оно применяется к каждому из тегов привязки, связанных с виджетом.Таким образом, если вы связываетесь с виджетом Toplevel
, вы фактически связываетесь с тегом с тем же именем, что и виджет.
Набор тегов привязки по умолчанию для виджета включает виджет, но также включает окно верхнего уровня, которое содержит виджет.Полный список содержит виджет, имя класса виджета (например, «Метка», «Кнопка» и т. Д.), Имя ближайшего предка верхнего уровня окна и специальную строку «все».
В случае привязки к <Destroy>
, когда верхний уровень уничтожается, он также вызывает уничтожение всех его дочерних элементов.Например, если на верхнем уровне есть метка, она также получит событие <Destroy>
.Поскольку метка имеет тег привязки, связанный с виджетом Toplevel
, связанная функция будет вызываться для метки в дополнение к обработке самим Toplevel
.