如何关闭tkinter窗口?

126

我该如何结束一个Tkinter程序?假设我有以下代码:

from Tkinter import *

def quit():
    # code to exit

root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

我应该如何定义quit函数以退出我的应用程序?

17个回答

180

你应该使用destroy()来关闭Tkinter窗口。

from Tkinter import * 
#use tkinter instead of Tkinter (small, not capital T) if it doesn't work
#as it was changed to tkinter in newer Python versions

root = Tk()
Button(root, text="Quit", command=root.destroy).pack() #button to close the window
root.mainloop()

说明:

root.quit()

上面这行代码只是绕过了 root.mainloop(),也就是说,如果执行 quit() 命令,root.mainloop() 仍然会在后台运行。

root.destroy()

destroy()命令会在root.mainloop()消失时消失,即root.mainloop()停止。而<window>.destroy()完全销毁并关闭窗口。

因此,如果您想要完全退出和关闭程序,应该使用root.destroy(),因为它停止了mainloop()并销毁了窗口及其所有小部件。

但是,如果您想要运行一些无限循环并且不想销毁您的Tkinter窗口,并且想要在root.mainloop()之后执行一些代码,则应该使用root.quit()。例如:

from Tkinter import *
def quit():
    global root
    root.quit()

root = Tk()
while True:
    Button(root, text="Quit", command=quit).pack()
    root.mainloop()
    #do something

请看这里,了解root.destroy()和root.quit()的区别。

2
如果使用root.quit(),那么如何在不同的脚本中找到窗口以便销毁它(以免继续使用系统资源)? - Raj
5
你的第一句话是错误的。调用quit将会销毁所有小部件;如果小部件被销毁,mainloop 将会退出。 - Bryan Oakley
1
经过一些研究,我相信这也适用于所有正在执行的代码。因此,如果您在命令行脚本中有一个TKinter的mainloop(),请使用root.quit()而不是root.destroy(),否则您的命令行脚本将无法继续执行mainloop()之后的代码。我测试过了,对我有效(我知道TKinter并不打算在这样的设计中使用,尽管它可以工作)。 - Alex
多次销毁Tkinter窗口并重新启动是一个好的解决方案吗? - Nitesh Waghmare
我将要调用很多具有相同名称的窗口,那么在这种情况下会怎样工作? - BurnDownTheWorld

47
def quit()
    root.quit()
或者
def quit()
    root.destroy()

有人知道哪种方法更“正确”吗?还是说其中一种比另一种更易读? - Opal
8
抱歉,我已经找到答案并想分享一下。更好的方法是使用root.destroy(),因为它可以终止主程序循环。参见:http://www.daniweb.com/software-development/python/threads/66698 - Opal
1
destroy() 是关闭打开窗口的方法。 如果您想关闭所有窗口,请使用 quit()。 - Sheshan Gamage
@SheshanGamage .quit 不会关闭窗口,它停止了 .mainloop,如果 .mainloop 在程序的末尾,则终止程序。.destroy 是唯一可以销毁任何窗口的方法,除了 Python 解释器关闭之外。 - TheLizzard

18
import tkinter as tk

def quit(root):
    root.destroy()

root = tk.Tk()
tk.Button(root, text="Quit", command=lambda root=root:quit(root)).pack()
root.mainloop()

7

混乱中的照明...

def quit(self):
    self.destroy()
    exit()

A) destroy() 停止主循环并关闭窗口,但不会停止 Python 运行。

B) exit() 停止整个进程。

为了防止有人错过 destroy() 的作用,原作者也问了如何“结束”一个 tkinter 程序。


7
我认为您误解了Tkinter的退出函数。这个函数不需要您进行定义。
首先,您应该按照以下方式修改您的函数:
from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.quit).pack()
root.mainloop()

然后,您应该使用“.pyw”后缀保存这些文件,并双击“.pyw”文件运行您的GUI。此时,您可以通过单击按钮来结束GUI,而且您还会发现没有令人不悦的DOS窗口。(如果运行“.py”文件,退出功能将失败。)


4

如果有人想把Escape键绑定到关闭整个GUI界面:

master = Tk()
master.title("Python")

def close(event):
    sys.exit()

master.bind('<Escape>',close)
master.mainloop()

4

退出Python程序的常规方法:

sys.exit()

你可以传递退出状态的进程,或者

raise SystemExit

在Tkinter程序中,这将正常工作。


7
问题是关于关闭一个 tkinter 窗口,而不是使用 tkinter 的程序。 - kevr

3
你只需要输入这个:
root.destroy()

当你将quit()函数设置为命令时,你甚至不需要使用它,因为它会退出整个程序。


不会,它将销毁所有的小部件并从对root.mainloop()的调用中返回。但是,任何在该调用之后可能存在的代码都将执行。这与退出整个程序是同一件事。 - Booboo

3

最简单的方法是点击红色按钮(在 macOS 上最左边,在 Windows 上最右边)。 如果您想将特定功能绑定到按钮小部件,可以这样做:

class App:
    def __init__(self, master)
        frame = Tkinter.Frame(master)
        frame.pack()
        self.quit_button = Tkinter.Button(frame, text = 'Quit', command = frame.quit)
        self.quit_button.pack()

或者,为了让事情变得更加复杂一些,可以使用协议处理程序和destroy()方法。
import tkMessageBox

def confirmExit():
    if tkMessageBox.askokcancel('Quit', 'Are you sure you want to exit?'):
        root.destroy()
root = Tk()
root.protocol('WM_DELETE_WINDOW', confirmExit)
root.mainloop()

2

除非你正在进行更复杂的操作,否则不需要打开一个函数来关闭窗口:

from Tkinter import *

root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
root.mainloop()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接