Помощь с библиотекой Tkinter в Python
Мой вопрос заключается в том, что когда пользователь нажимая на кнопку в одном окне root()
создает другое окно, названное как root_one(), в root_one(), присутствует кнопка чтобы закрыть окно root_one(), и есть проблема в том, что если нажать подряд два раза на кнопку в окне root() для создания двух окно root_one(), когда после нажимаю в одном из окон root_one() кнопку чтобы закрыть окно root_one(), оно закрывается, а вот со вторым как полагается его закрыть, вместо этого он выводит ошибку :_tkinter.TclError: can't invoke "destroy" command: application has been destroyed, что окно уже закрыто. Хотя его копию висит на рабочем столе. Кто знает как это починить?
Когда ты нажимаешь дважды на кнопку «Создать окно», ты, скорее всего, каждый раз создаёшь новый экземпляр Tk() — а это неправильно. В Tkinter должен быть только один главный экземпляр Tk(). Все остальные дополнительные окна нужно создавать через Toplevel.
Из‑за того, что ты создаёшь второй Tk(), при закрытии первого «дестроится» всё приложение, и второй экземпляр уже не может корректно уничтожиться (ты и видишь ошибку, что команда destroy вызвана на уже разрушенном приложении).
import tkinter as tk
def open_child():
# создаём новое окно-диалог
child = tk.Toplevel(root)
child.title("Окно #{}".format(len(children_windows)+1))
children_windows.append(child)
# кнопка закрытия именно этого окна
btn_close = tk.Button(child, text="Закрыть это окно",
command=lambda w=child: close_child(w))
btn_close.pack(padx=20, pady=20)
def close_child(window):
# уничтожаем переданный экземпляр Toplevel
if window.winfo_exists():
window.destroy()
children_windows.remove(window)
root = tk.Tk()
root.title("Главное окно")
children_windows = []
btn_open = tk.Button(root, text="Создать новое окно", command=open_child)
btn_open.pack(padx=30, pady=30)
root.mainloop()
Не создавайте более одного Tk() в приложении.
Для диалогов и вспомогательных окон всегда пользуйтесь Toplevel.