Как обработать событие закрытия окна (нажатие кнопки «X») в программе Python Tkinter?Как обработать событие закрытия окна в Tkinter?
ответ
Tkinter поддерживает механизм под названием protocol handlers. Здесь термин протокол относится к взаимодействию между приложением и диспетчером окон. Наиболее часто используемый протокол называется WM_DELETE_WINDOW
и используется для определения того, что происходит, когда пользователь явно закрывает окно с помощью диспетчера окон.
Вы можете использовать метод для установить обработчик для этого протокола (виджет должен быть Tk
или Toplevel
виджет):
Вот вам конкретный пример:
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
def on_closing():
if messagebox.askokcancel("Quit", "Do you want to quit?"):
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()
Используйте closeEvent
def closeEvent(self, event):
# code to be executed
Мэтт показал один классический модификатор n кнопки закрытия.
Другой должен иметь кнопку закрытия, чтобы минимизировать окно.
Вы можете воспроизвести это поведение, используя метод iconify
- второй аргумент метода protocol.
Вот рабочий пример, протестирована на Windows 7:
# Python 3
import tkinter
import tkinter.scrolledtext as scrolledtext
class GUI(object):
def __init__(self):
root = self.root = tkinter.Tk()
root.title('Test')
# make the top right close button minimize (iconify) the main window
root.protocol("WM_DELETE_WINDOW", root.iconify)
# make Esc exit the program
root.bind('<Escape>', lambda e: root.destroy())
# create a menu bar with an Exit command
menubar = tkinter.Menu(root)
filemenu = tkinter.Menu(menubar, tearoff=0)
filemenu.add_command(label="Exit", command=root.destroy)
menubar.add_cascade(label="File", menu=filemenu)
root.config(menu=menubar)
# create a Text widget with a Scrollbar attached
txt = scrolledtext.ScrolledText(root, undo=True)
txt['font'] = ('consolas', '12')
txt.pack(expand=True, fill='both')
gui = GUI()
gui.root.mainloop()
В этом примере мы даем пользователю два новых варианта выхода:
классическое меню Файл -> Выход, а также кнопку Esc ,
Я использовал аналогичный код, но с `root.destroy()` – 182764125216 2011-08-03 00:03:34
Если вы используете что-то вроде Twisted, которое поддерживает цикл событий независимо или Tkinter (например, объект реактора витой резины), убедитесь, что внешний основной контур остановлен с любой сменой он обеспечивает для этой цели (например: reactor.stop() для скручивания) – 2012-02-13 16:40:54