Wie schließe ich ein tkinter-Fenster?

83

Wie beende ich ein Tkinter-Programm? Angenommen, ich habe diesen Code:

from Tkinter import *

def quit():
    # code to exit

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

Wie soll ich die quitFunktion zum Beenden meiner Anwendung definieren?

Matt Gregory
quelle

Antworten:

112

Sie sollten verwenden destroy(), um ein tkinter-Fenster zu schließen.

from Tkinter import *

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

Erläuterung:

root.quit()

Die obige Zeile umgeht nur das, root.mainloop()dh root.mainloop()wird weiterhin im Hintergrund ausgeführt, wenn der quit()Befehl ausgeführt wird.

root.destroy()

Während destroy()Befehl verschwinden, root.mainloop()dh root.mainloop()stoppt.

Wenn Sie also nur das Programm beenden möchten, sollten root.destroy()Sie es so verwenden, wie es wird mainloop().

Aber wenn Sie eine Endlosschleife ausführen möchten und Ihr Tk-Fenster nicht zerstören möchten und Code nach root.mainloop()Zeile ausführen möchten, sollten Sie verwenden root.quit(). Ex:

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

root = Tk()
while True:
    Button(root, text="Quit", command=quit).pack()
    root.mainloop()
    #do something
aki92
quelle
2
Wenn root.quit () verwendet wird, wie kann das Fenster später in einem anderen zu zerstörenden Skript wiedergefunden werden (um die Systemressourcen nicht weiter zu verwenden)?
Raj
3
Ihre erste Aussage ist falsch. Durch das Aufrufen quitwerden alle Widgets zerstört. Wenn die Widgets zerstört werden, mainloopwird beendet.
Bryan Oakley
1
Nach einigen Recherchen glaube ich, dass dies auch für ALLEN Code gilt, der ausgeführt wird. Wenn Sie also einen mainloop () von TKinter in einem Befehlszeilenskript haben, verwenden Sie root.quit () und nicht root.destroy (). Andernfalls führt Ihr Befehlszeilenskript den Code nach mainloop () nicht weiter aus. Ich habe dies getestet und es funktioniert für mich (mir ist bewusst, dass TKinter nicht für ein solches Design vorgesehen ist, es funktioniert jedoch)
Alex
ist es eine gute Lösung, das Tkinter-Fenster viele Male zu zerstören und viele Male zu starten
Nitesh Waghmare
39
def quit()
    root.quit()

oder

def quit()
    root.destroy()
Matt Gregory
quelle
Weiß jemand, welche Methode „korrekter“ ist oder ob eine besser lesbar ist als eine andere
Opal
8
Entschuldigung, ich habe die Antwort gefunden und dachte nur, ich würde sie teilen. Es ist besser zu verwenden, root.destroy()da es die Hauptprogrammschleife beendet. Siehe: http://www.daniweb.com/software-development/python/threads/66698
Opal
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()
DiebMaster
quelle
7

Die übliche Methode zum Beenden eines Python-Programms:

sys.exit()

(an die Sie auch einen Exit-Status übergeben können) oder

raise SystemExit

funktioniert gut in einem Tkinter-Programm.

dF.
quelle
3
Die Frage war, ein tkinter-Fenster zu schließen, kein Programm, das tkinter verwendet.
Kevr
7

Ich denke, Sie haben die Beendigungsfunktion von Tkinter falsch verstanden. Für diese Funktion müssen Sie keine Definition vornehmen.

Zunächst sollten Sie Ihre Funktion wie folgt ändern:

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

Dann sollten Sie das Suffix '.pyw' verwenden, um diese Dateien zu speichern, und auf die Datei '.pyw' doppelklicken, um Ihre GUI auszuführen. Dieses Mal können Sie die GUI mit einem Klick auf die Schaltfläche beenden, und Sie können das auch finden Es wird kein unangenehmes DOS-Fenster geben. (Wenn Sie die '.py'-Datei ausführen, schlägt die Beendigungsfunktion fehl.)

TreeDoNotSplit
quelle
5

Beleuchtung bei Verwirrung ...

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

A) destroy () stoppt den Mainloop und tötet das Fenster, lässt aber Python laufen

B) exit () stoppt den gesamten Prozess

Nur um zu klären, falls jemand verpasst hat, was destroy () tut, und das OP fragte auch, wie ein tkinter-Programm "beendet" werden soll.

Martin Guiles
quelle
3

Sie müssen nur Folgendes eingeben:

root.destroy()

und Sie brauchen nicht einmal die Funktion quit (), wenn Sie dies als Befehl festlegen, wird das gesamte Programm beendet.

BE Offiziell sein
quelle
2

Falls jemand seine Escape-Schaltfläche an das Schließen der gesamten GUI binden möchte:

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

def close(event):
    sys.exit()

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

Im idlelib.PyShellModul wird eine rootVariable vom Typ Tkals global definiert

Am Ende der PyShell.main()Funktion ruft es die root.mainloop()Funktion auf, die eine Endlosschleife ist, und läuft, bis die Schleife durch die root.quit()Funktion unterbrochen wird . Daher root.quit()wird nur die Ausführung von unterbrochenmainloop

Um alle Widgets zu zerstören, die zu diesem Idlelib-Fenster gehören, root.destroy()muss aufgerufen werden, was die letzte idlelib.PyShell.main()Funktionszeile ist.

RAD
quelle
1

Sie können verwenden:

root.destroy()

Oder

root.quit()

Wenn dies nicht funktioniert, ändern Sie root in die Variable, die sich zu Beginn Ihres Programms befand

import tkinter

main = Tk()

main.destroy()

main.mainloop
JackHumphries
quelle
1

Am einfachsten ist es, auf die rote Schaltfläche zu klicken (unter macOS ganz links und unter Windows ganz rechts). Wenn Sie eine bestimmte Funktion an ein Schaltflächen-Widget binden möchten, haben Sie folgende Möglichkeiten:

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()

Um die Dinge etwas komplexer zu gestalten, verwenden Sie die Protokollhandler und die destroy()Methode.

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()
Ian Gabaraev
quelle
0
def quit1():
     root.destroy()

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

Sollte tun, was Sie fragen.

Harrison Sills
quelle
Hey Harrison, Sie haben eine sehr späte Antwort, die für die vorhandenen Antworten nichts Besonderes bietet. Obwohl wir die Teilnahme sehr schätzen, bietet Ihre Antwort keinen zusätzlichen Einblick. Schauen Sie sich zum Beispiel einige der anderen Antworten an, sie machen einen großartigen Job und erklären, warum einige Ansätze funktionieren und andere nicht.
TheOneWhoPrograms
0

Für Menüleisten:

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()
LenyaKap
quelle
0

Ich benutze die folgenden Codes für den Ausgang des Tkinter-Fensters:

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

oder

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

oder

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

oder

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

Code-Snippet unten. Ich biete ein kleines Szenario.

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()

Ich habe ein leeres Fenster hier erstellt und Datei - Menü - Option auf dem gleichen Fenster (root Fenster) hinzufügen, wo ich nur eine Option hinzufügen Ausfahrt .

Führen Sie dann einfach mainloop für root aus .

Versuchen Sie es einmal

Ozzius
quelle
0

root.destroywird funktionieren.
root.quitwird auch funktionieren.

In meinem Fall hatte ich

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

Ich hoffe es hilft.

Parikh Goyal
quelle
0

Es gibt eine einfache einzeilige Antwort:

Schreiben Sie - exit()in den Befehl

Das ist es!

Amay Agarwal
quelle
-1
raise SystemExit

Dies funktionierte beim ersten Versuch, wo

self.destroy()
root.destroy()

nicht

Navarra Softwarelösungen
quelle
-2

Versuche dies:

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

Versuche dies.

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

Vielleicht senden Sie einen root-ähnlichen Parameter an einen Frame, den Sie erstellt haben. Wenn du es beenden willst, musst du deinen Vater anrufen, damit er alles schließen kann, anstatt jedes seiner Kinder zu schließen.

Jose Pablo Castillo
quelle
4
Bitte poste keine spekulativen Antworten. Sie sollten im Idealfall nur posten, wenn Sie eine nachgewiesene und überprüfbare Antwort haben. Wenn Sie Vorschläge haben, können diese in einem Kommentar stehen.
SuperBiasedMan
Wenn Sie eine Klasse verwenden, hat self.parent.destroy () in meiner Situation funktioniert.
Zak