Отследить закрытие дочернего окна в 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
все так, насколько я понимаю в вашем коде отслеживание происходим в дочернем окне, а мне нужно чтобы в главном
Всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.
Вам надо научиться хорошо рассказывать, что вы хотите сделать и что у вас не получается.
Обновленный вариант ниже
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()