如何处理窗口关闭事件(用户点击“X”按钮)在Python的Tkinter程序?
Answer 1:
Tkinter的支持一种称为机制的协议处理程序 。 这里,术语协议指的是应用程序和窗口管理器之间的交互作用。 最常用的协议被称为WM_DELETE_WINDOW
,并用于定义当用户明确地关闭使用的窗口管理器窗口时会发生什么。
您可以使用该protocol
方法来安装处理程序对该协议(小部件必须是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()
Answer 2:
马特已经显示关闭按钮中的一个经典的修改。
另一种是有关闭按钮将窗口最小化。
您可以通过具有复制这种行为图标化方法
是协议方法的第二个参数。
这里有一个工作的例子,在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键。
Answer 3:
根据Tkinter的活动,结束ESP。 使用Tkinter.after时,停止该行为与destroy()
-即使使用协议(),按钮等-会扰乱这个活动(“在执行”错误),而不是仅仅终止它。 在几乎所有情况下最好的解决方案是使用一个标志。 下面是如何使用它(虽然我敢肯定,你们中的大多数并不需要它一个简单的,愚蠢的例子!:)
from Tkinter import *
def close_window():
global running
running = False
print "Window closed"
root = Tk()
root.protocol("WM_DELETE_WINDOW", close_window)
cv = Canvas(root, width=200, height=200); cv.pack()
running = True;
# This is an endless loop stopped only by setting 'running' to 'False'
while running:
for i in range(200):
if not running: break
cv.create_oval(i,i,i+1,i+1); root.update()
这很好地终止图形活动。 你只需要检查running
在正确的地方(一个或多个)。
Answer 4:
使用的closeEvent
def closeEvent(self, event):
# code to be executed
文章来源: How do I handle the window close event in Tkinter?