如何处理在Tkinter的窗口关闭事件?如何处理在Tkinter的窗口关闭事件?(How do I

2019-06-02 13:44发布

如何处理窗口关闭事件(用户点击“X”按钮)在Python的Tkinter程序?

Answer 1:

Tkinter的支持一种称为机制的协议处理程序 。 这里,术语协议指的是应用程序和窗口管理器之间的交互作用。 最常用的协议被称为WM_DELETE_WINDOW ,并用于定义当用户明确地关闭使用的窗口管理器窗口时会发生什么。

您可以使用该protocol方法来安装处理程序对该协议(小部件必须是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()


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?