Отследить закрытие дочернего окна в Tkinter

Есть функция Users(), которая вызывает дочернее окно.
Как дождаться закрытия дочернего окна и уже потом выполнить TableSetupUsersInsert() ?

Сейчас эта функция выполняется не дожидаясь закрытия дочернего окна:

def users_setup_users():
    Users()
    TableSetupUsersInsert()

Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так:

import tkinter as tk


class App:
    def __init__(self):
        self.root = tk.Tk()
        self.count = 0
        b=tk.Button(text="create window", command=self.create_window)
        b.pack()
        self.root.mainloop()

    def create_window(self):
        self.count += 1
        t=FadeToplevel(self.root)
        t.wm_title("Window %s" % self.count)
        t.fade_in()


class FadeToplevel(tk.Toplevel):
    '''A toplevel widget with the ability to fade in'''
    def __init__(self, *args, **kwargs):
        tk.Toplevel.__init__(self, *args, **kwargs)
        self.attributes("-alpha", 0.0)
# !!! +++        
        self.protocol('WM_DELETE_WINDOW', self.TableSetupUsersInsert)   # Отследить закрытие 


    def fade_in(self):
        alpha = self.attributes("-alpha")
        alpha = min(alpha + .01, 1.0)
        self.attributes("-alpha", alpha)
        if alpha < 1.0:
            self.after(10, self.fade_in)
# !!! +++
    def TableSetupUsersInsert(self):                                    #  Отследили
        self.destroy()
        print('Дочернее окно закрыто. Делайте что-нибудь.')
         

if __name__ == "__main__":
    app=App()

введите сюда описание изображения


Update

все так, насколько я понимаю в вашем коде отслеживание происходим в дочернем окне, а мне нужно чтобы в главном

  1. Всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.

  2. Вам надо научиться хорошо рассказывать, что вы хотите сделать и что у вас не получается.

  3. Обновленный вариант ниже


import tkinter as tk


class App:
    def __init__(self):
        self.root = tk.Tk()
        self.count = 0
        b=tk.Button(text="create window", command=self.create_window)
        b.pack()
        self.root.mainloop()

    def create_window(self):
        self.count += 1

        t = FadeToplevel(self)                                           # +++
        
        t.wm_title("Window %s" % self.count)
        t.fade_in()
# !!! +++
    def TableSetupUsersInsert(self, text):                                #  Отследили
        print(text)        
        


class FadeToplevel(tk.Toplevel):
    '''A toplevel widget with the ability to fade in'''
    def __init__(self, parant, *args, **kwargs):                          # +++
        tk.Toplevel.__init__(self, *args, **kwargs)

        self.parent = parant                                              # +++
        
        self.attributes("-alpha", 0.0)
# !!! +++        
        self.protocol('WM_DELETE_WINDOW', self.closeToplevel)   # Отследить закрытие 


    def fade_in(self):
        alpha = self.attributes("-alpha")
        alpha = min(alpha + .01, 1.0)
        self.attributes("-alpha", alpha)
        if alpha < 1.0:
            self.after(10, self.fade_in)
# !!! +++
    def closeToplevel(self):                                    #  Отследили
        self.destroy()
        text = 'Дочернее окно закрыто. Делайте что-нибудь.'
        self.parent.TableSetupUsersInsert(text)
        
         

if __name__ == "__main__":
    app=App()
→ Ссылка