Помощь с библиотекой Tkinter в Python

Есть окно root() с кнопкой.

Когда пользователь нажимает на кнопку в окне root(), создается дочернее окно root_one().

В окне root_one(), присутствует кнопка - закрыть окно root_one().

Если в окне root() два раза подряд нажать на кнопку создания окон root_one(), получаем два окна root_one().


И есть проблема:

после нажатия в одном из окон root_one() на кнопку закрытия, первое окно root_one() закрывается как и должно.

Но в случае со вторым, вместо того чтоб закрыть его, библиотека выводит ошибку:

_tkinter.TclError: can't invoke "destroy" command: application has been destroyed

Что окно уже закрыто. Хотя его копия висит на рабочем столе.

Кто знает как это починить?


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

Автор решения: Кимерченко

Корень окна должен быть один - Tk(). Вызывается только один раз за всё приложение, а всё остальное создаётся через Toplevel(). А ты создаёшь второй Tk, потом его закрываешь - интерпретатор считает, что всё приложение завершено, и оставшееся окно превращается в труп.

В итоге при попытке вызвать destroy() ловишь TclError, потому что приложение уже уничтожено.

import tkinter as tk

root = tk.Tk() # единственный корень

def open_child():
    win = tk.Toplevel(root) # новое окно, а не новый Tk
    win.title("child")
    tk.Button(win, text="Закрыть", command=win.destroy).pack(padx=30, pady=30)

tk.Button(root, text="Новое окно", command=open_child).pack(padx=30, pady=30)

root.mainloop()
→ Ссылка