2008-09-21 8 views

ответ

93

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() 
+5

Я использовал аналогичный код, но с `root.destroy()` – 182764125216 2011-08-03 00:03:34

+2

Если вы используете что-то вроде Twisted, которое поддерживает цикл событий независимо или Tkinter (например, объект реактора витой резины), убедитесь, что внешний основной контур остановлен с любой сменой он обеспечивает для этой цели (например: reactor.stop() для скручивания) – 2012-02-13 16:40:54

-13

Используйте closeEvent

def closeEvent(self, event): 
# code to be executed 
13

Мэтт показал один классический модификатор 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 ,