Есть несколько способов закрыть окно Tkinter в Python, в зависимости от того, что именно вы хотите сделать. Вот наиболее распространенные варианты:
1. Закрытие текущего окна (root или Toplevel):
- Root. destroy() (или Window. destroy()): Этот метод полностью уничтожает окно и все его дочерние виджеты (кнопки, лейблы и т. д.). Это самый надежный и “чистый” способ закрыть окно. root обычно используется для главного окна приложения, а window для дополнительных окон, созданных с помощью Toplevel().
· import tkinter as tk
·
· def close_window():
· root. destroy() # Закрыть главное окно
·
· root = tk. Tk()
· root. title("Пример закрытия окна")
·
· button = tk. Button(root, text="Закрыть окно", command=close_window)
· button. pack()
·
· root. mainloop()
- Root. quit() (или Window. quit()): Этот метод выходит из главного цикла событий Tkinter (mainloop), что обычно приводит к закрытию всех окон Tkinter. В некоторых случаях он может быть менее надежным, чем destroy(), особенно если у вас есть другие процессы, использующие Tkinter.
· import tkinter as tk
·
· def close_window():
· root. quit() # Выйти из главного цикла и закрыть окно
·
· root = tk. Tk()
· root. title("Пример закрытия окна")
·
· button = tk. Button(root, text="Закрыть окно", command=close_window)
· button. pack()
·
· root. mainloop()
2. Закрытие конкретного Toplevel окна (не главного):
Если вы создали несколько окон с помощью Toplevel(), вам нужно использовать destroy() на конкретном окне, которое вы хотите закрыть.
Import tkinter as tk
Def open_new_window():
global new_window # Объявляем new_window как глобальную переменную
new_window = tk. Toplevel(root)
new_window. title("Новое окно")
tk. Button(new_window, text="Закрыть это окно", command=close_new_window).pack()
Def close_new_window():
new_window. destroy() # Закрыть Новое Окно
Root = tk. Tk()
Root. title("Главное окно")
Tk. Button(root, text="Открыть новое окно", command=open_new_window).pack()
Root. mainloop()
3. Закрытие окна по нажатию на крестик (X) в заголовке окна:
Чтобы перехватить нажатие на кнопку закрытия окна (X) и выполнить свой код (например, спросить пользователя о подтверждении), вы можете использовать метод protocol("WM_DELETE_WINDOW", callback_function).
Import tkinter as tk
From tkinter import messagebox
Def on_closing():
if messagebox. askokcancel("Выход", "Вы уверены, что хотите выйти?"):
root. destroy()
Root = tk. Tk()
Root. title("Подтверждение закрытия окна")
Root. protocol("WM_DELETE_WINDOW", on_closing) # Перехватываем нажатие на крестик
Label = tk. Label(root, text="Нажмите на крестик, чтобы закрыть окно.")
Label. pack(padx=20, pady=20)
Root. mainloop()
Объяснение Protocol("WM_DELETE_WINDOW", callback_function):
- Root. protocol("WM_DELETE_WINDOW", on_closing): Эта строка сообщает Tkinter, что при нажатии на кнопку закрытия окна (X), вместо обычного закрытия окна, нужно вызвать функцию on_closing. WM_DELETE_WINDOW: Это имя протокола, который отвечает за событие закрытия окна. On_closing: Это имя функции, которая будет вызвана при нажатии на кнопку закрытия окна.
Ключевые моменты:
- Destroy() vs Quit(): Используйте destroy() для уничтожения конкретного окна и всех его дочерних виджетов. Используйте quit() для выхода из главного цикла Tkinter, что обычно приводит к закрытию всех окон, но может быть менее надежным в сложных приложениях. Toplevel() окна: Для закрытия дополнительных окон, созданных с помощью Toplevel(), используйте window. destroy(), где window – это переменная, содержащая ссылку на объект Toplevel. Перехват нажатия на крестик: Используйте root. protocol("WM_DELETE_WINDOW", callback_function) для перехвата события закрытия окна и выполнения своего кода (например, для подтверждения закрытия). Глобальные переменные: Если функция close_new_window вызывается после того, как окно new_window было создано в другой функции, нужно использовать global new_window внутри функции open_new_window, чтобы функция close_new_window могла получить доступ к переменной new_window.
Выбирайте способ закрытия окна, который лучше всего соответствует вашим потребностям. destroy() обычно является наиболее надежным и предпочтительным методом.