2008-09-21 46 views

回答

93

Tkinter支持名为protocol handlers的机制。这里,术语协议是指应用程序和窗口管理器之间的交互。最常用的协议称为WM_DELETE_WINDOW,用于定义用户使用窗口管理器明确关闭窗口时发生的情况。

可以使用方法安装处理器此协议(小部件必须是TkToplevel小部件):

这里有一个具体的例子:

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(例如:twisted的reactor对象)的东西,确保外部主循环被任何smenatics它提供了这个目的(例如:twisted.stop()用于扭曲) – 2012-02-13 16:40:54

-13

使用closeEvent

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

Matt已经显示了一个经典的修改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键按钮。