112

如何结束 Tkinter 程序?假设我有这个代码:

from Tkinter import *

def quit():
    # code to exit

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

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

4

17 回答 17

153

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

from Tkinter import *

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

解释:

root.quit()

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

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
于 2013-03-22T18:39:54.357 回答
44
def quit()
    root.quit()

或者

def quit()
    root.destroy()
于 2008-09-21T12:44:01.880 回答
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()
于 2008-11-16T18:36:55.683 回答
7

我认为您错误地理解了 Tkinter 的退出功能。这个函数不需要你定义。

首先,您应该如下修改您的函数:

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

然后,你应该使用'.pyw'后缀来保存这个文件并双击'.pyw'文件来运行你的GUI,这一次你可以通过点击按钮结束GUI,你也可以发现不会出现令人不快的 DOS 窗口。(如果您运行“.py”文件,退出功能将失败。)

于 2013-09-17T14:41:22.490 回答
5

退出 Python 程序的常用方法:

sys.exit()

(您也可以向其传递退出状态)或

raise SystemExit

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

于 2008-09-21T13:24:39.613 回答
5

在混乱的情况下照明...

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

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

B) exit() 停止整个过程

只是为了澄清以防有人错过了 destroy() 正在做什么,并且 OP 还询问了如何“结束” tkinter 程序。

于 2016-08-26T21:22:15.913 回答
3

你只需要输入这个:

root.destroy()

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

于 2019-04-05T13:05:35.363 回答
2

最简单的方法是单击红色按钮(在 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()
于 2018-07-24T09:56:24.070 回答
2

如果有人想将他们的 Escape 按钮绑定到关闭整个 GUI:

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

def close(event):
    sys.exit()

master.bind('<Escape>',close)
master.mainloop()
于 2018-10-29T08:42:58.827 回答
2

你不必打开一个函数来关闭你的窗口,除非你正在做一些更复杂的事情:

from Tkinter import *

root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
root.mainloop()
于 2021-07-28T14:58:50.627 回答
1

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

PyShell.main()函数结束时,它调用root.mainloop()函数,这是一个无限循环,它一直运行到循环被root.quit()函数中断。因此,root.quit()只会中断执行mainloop

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

于 2017-05-22T21:11:12.450 回答
1

我通常使用默认的 tkinterquit函数,但你可以自己做,像这样:

from tkinter import *
from tkinter.ttk import *

window = Tk()
window.geometry('700x700') # 700p x 700p screen

def quit(self):
    proceed = messagebox.askyesno('Quit', 'Quit?')
    proceed = bool(proceed) # So it is a bool

    if proceed:
        window.quit()
    else:
        # You don't really need to do this
        pass

btn1 = Button(window, text='Quit', command=lambda: quit(None))

window.mainloop()
于 2021-07-26T14:03:43.447 回答
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()
于 2018-12-13T04:33:52.897 回答
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()
于 2019-05-02T17:32:04.563 回答
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

尝试做一次

于 2019-09-18T09:35:25.163 回答
0

当然,您可以将命令分配给按钮,如下所示,但是,如果您正在制作 UI,建议将相同的命令分配给“X”按钮:

def quit(self): # Your exit routine
   self.root.destroy()

self.root.protocol("WM_DELETE_WINDOW", self.quit) # Sets the command for the "X" button 

Button(text="Quit", command=self.quit) # No ()

于 2021-02-14T18:27:38.160 回答
-1

有一个简单的单行答案:

写 -exit()在命令中

就是这样!

于 2020-04-21T04:01:26.913 回答