Top.Mail.Ru
Ответы

Помощь с библиотекой 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, что окно уже закрыто. Хотя его копию висит на рабочем столе. Кто знает как это починить?

По дате
По рейтингу
Аватар пользователя
Просветленный
1нед
Изменено

Когда ты нажимаешь дважды на кнопку «Создать окно», ты, скорее всего, каждый раз создаёшь новый экземпляр Tk() — а это неправильно. В Tkinter должен быть только один главный экземпляр Tk(). Все остальные дополнительные окна нужно создавать через Toplevel.

Из‑за того, что ты создаёшь второй Tk(), при закрытии первого «дестроится» всё приложение, и второй экземпляр уже не может корректно уничтожиться (ты и видишь ошибку, что команда destroy вызвана на уже разрушенном приложении).

1234567891011121314151617181920212223242526272829
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()
Аватар пользователя
Искусственный Интеллект
3нед
  • Не создавайте более одного Tk() в приложении.

  • Для диалогов и вспомогательных окон всегда пользуйтесь Toplevel.