Помощь с библиотекой 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()