如何关闭Tkinter窗口?


83

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

from Tkinter import *

def quit():
    # code to exit

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

如何定义quit退出应用程序的功能?

Answers:


113

您应该destroy()用来关闭tkinter窗口。

from Tkinter import *

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

说明:

root.quit()

上面的行只是绕过root.mainloop()ie root.mainloop(),如果quit()执行了命令,ie仍将在后台运行。

root.destroy()

destroy()命令消失时,root.mainloop()root.mainloop()停止。

因此,您只想退出该程序,就应该使用root.destroy()它,因为它会停止mainloop()

但是如果你想运行无限循环并且你不想破坏你的Tk窗口并且想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

2
如果使用root.quit(),以后如何在另一个脚本中再次找到该窗口以将其销毁(以免继续使用系统资源)?
拉吉

3
您的第一个陈述是错误的。调用quit将销毁所有小部件;如果小部件被破坏,mainloop将退出。
Bryan Oakley

1
经过研究,我相信这也适用于所有正在执行的代码。因此,如果命令行脚本中包含TKinter的mainloop(),请使用root.quit()而不是root.destroy(),否则您的命令行脚本将不会在mainloop()之后继续执行代码。我对此进行了测试,并且对我有用(我知道TKinter并不打算在这种设计中使用,尽管它可以工作)
Alex

是多次摧毁Tkinter窗口并多次启动的好方法


17
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

退出Python程序的常用方法:

sys.exit()

(您也可以将退出状态传递给该状态)或

raise SystemExit

在Tkinter程序中可以正常工作。


3
问题是关于关闭tkinter窗口,而不是使用tkinter的程序。
kevr

7

我认为您错误地理解了Tkinter的退出功能。此功能不需要您定义。

首先,您应该按以下方式修改功能:

from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.quit).pack()
root.mainloop()

然后,您应该使用“ .pyw”后缀保存此文件,然后双击“ .pyw”文件以运行您的GUI,这一次,您可以单击“按钮”结束GUI,并且您还可以找到不会有不愉快的DOS窗口。(如果运行“ .py”文件,则退出功能将失败。)


5

发生混乱时的照明...

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

A)destroy()停止mainloop并杀死窗口,但让python运行

B)exit()停止整个过程

为了澄清以防万一有人错过了destroy()所做的事情,OP还询问了如何“结束” tkinter程序。


3

您只需要输入以下内容:

root.destroy()

并且您甚至不需要quit()函数,因为将其设置为comm时,它将退出整个程序。


2

如果有人想将其“转义”按钮绑定到关闭整个GUI:

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

def close(event):
    sys.exit()

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

1

idlelib.PyShell模块中,root类型变量Tk定义为全局变量

PyShell.main()函数末尾,它调用root.mainloop()函数,它是一个无限循环,直到循环被root.quit()函数中断为止。因此,root.quit()只会中断执行mainloop

为了销毁与该idlelib窗口有关的所有小部件,root.destroy()需要调用它,这是idlelib.PyShell.main()功能的最后一行。


1

您可以使用:

root.destroy()

要么

root.quit()

如果这样不起作用,请将root更改为程序开始时的变量

import tkinter

main = Tk()

main.destroy()

main.mainloop

1

最简单的方法是单击红色按钮(在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()

0
def quit1():
     root.destroy()

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

0
import sys
from Tkinter import *
def quit():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

应该按照您的要求做。


嘿哈里森,您的答案很晚,现有的答案并没有提供任何额外的内容。尽管我们非常感谢您的参与,但您的回答并没有提供任何其他见解。例如,看一下其他一些答案,它们很好地解释了为什么某些方法有效而另一些无效的原因。
TheOneWhoPrograms

0

对于菜单栏:

def quit():
    root.destroy()

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)

filemenu.add_separator()

filemenu.add_command(label="Exit", command=quit)
menubar.add_cascade(label="menubarname", menu=filemenu)
root.config(menu=menubar)
root.mainloop()

0

我将以下代码用于Tkinter窗口的退出:

from tkinter import*
root=Tk()
root.bind("<Escape>",lambda q:root.destroy())
root.mainloop()

要么

from tkinter import*
root=Tk()
Button(root,text="exit",command=root.destroy).pack()
root.mainloop()

要么

from tkinter import*
root=Tk()
Button(root,text="quit",command=quit).pack()
root.mainloop()

要么

from tkinter import*
root=Tk()
Button(root,text="exit",command=exit).pack()
root.mainloop()

0

下面的代码段。我提供一个小场景。

import tkinter as tk
from tkinter import *

root = Tk()

def exit():
    if askokcancel("Quit", "Do you really want to quit?"):
        root.destroy()

menubar = Menu(root, background='#000099', foreground='white',
               activebackground='#004c99', activeforeground='white')

fileMenu = Menu(menubar,  tearoff=0, background="grey", foreground='black',
                activebackground='#004c99', activeforeground='white')
menubar.add_cascade(label='File', menu=fileMenu)

fileMenu.add_command(label='Exit', command=exit)

root.config(bg='#2A2C2B',menu=menubar)

if __name__ == '__main__':
    root.mainloop()

我在这里创建了一个空白窗口,并在同一窗口(根窗口)上添加了文件菜单选项,在这里我仅添加了一个选项exit

然后只需为root运行mainloop即可。

尝试做一次


0

root.destroy将工作。
root.quit也可以。

就我而言

quitButton = Button(frame, text = "Quit", command = root.destroy)

希望能帮助到你。




-2

试试这个:

from Tkinter import *
import sys
def exitApp():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=exitApp).pack()
root.mainloop()

-4

试试这个。

    self.parent.destroy() 
    self.parent.quit()

也许您将像root这样的参数发送到您所做的帧。因此,如果您想完成该任务,则必须给您的父亲打电话,以便他可以将其全部关闭,而不是关闭每个孩子。


4
请不要发布推测性答案。理想情况下,您只应在有可靠且可验证的答案时才能发帖。如果您有建议,可以在评论中进行。
SuperBiasedMan

当您使用类时,self.parent.destroy()在我的情况下起作用。
Zak
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.