Изменить значение после закрытия дочернего окна
Как выполнить действие только после закрытия дочернего окна.
Простой привер кода:
from tkinter import *
class test(Frame):
def __init__(self, master):
super().__init__(master)
self.a = Label(root, text='111')
self.a.pack()
two()
self.a.config(text='222')
class two(Toplevel):
def __init__(self):
super().__init__()
#какие-то действия
pass
if __name__ == "__main__":
root = Tk()
app = test(root)
root.mainloop()
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Стандартный способ дождаться закрытия дочернего окна - метод .wait_window(). В примере ниже показываю как получить какой-либо результат из дочернего окна, но это опционально.
from tkinter import *
class test(Frame):
def __init__(self, master):
super().__init__(master)
self.a = Label(root, text='111')
self.a.pack()
window_two = two(master=self) # Создаем окно
window_two.wait_window() # Ждем его уничтожения
# Выводим значение поля result из дочернего окна
self.a.config(text=window_two.result)
class two(Toplevel):
def __init__(self, master):
super().__init__(master=master)
# Результат по-умолчанию - None
# Если окно будет закрыто через крестик, а не через OK, это будет значение результата
self.result = None
self.entry = Entry(self)
self.entry.pack()
Button(self, text="OK", command=self.on_ok).pack()
# Три строки ниже нужны, чтобы пока существует второе диалоговое окно, основное окно блокировалось
# (чтобы дочернее окно было модальным)
self.transient(master)
self.grab_set()
self.focus_set()
def on_ok(self):
# При нажатии на OK текст из поля ввода записываем в поле result и уничтожаем окно
self.result = self.entry.get()
self.destroy()
if __name__ == "__main__":
root = Tk()
app = test(root)
root.mainloop()
Более простой пример, без классов, с вызовом диалога через функцию и возврата результата из нее же (а не через поле объекта): Entry в Toplevel - как взять значение