Изменить значение после закрытия дочернего окна

Как выполнить действие только после закрытия дочернего окна.

Простой привер кода:

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 - как взять значение

→ Ссылка