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?

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

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


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

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.


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


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.


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.


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

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.


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

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

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

Sollte tun, was Sie fragen.


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

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

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


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.


0

Es gibt eine einfache einzeilige Antwort:

Schreiben Sie - exit()in den Befehl

Das ist es!



-2

Versuche dies:

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

-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.