wake-up-neo.com

Wie schließe ich ein Tkinter-Fenster?

Wie beende ich ein Tkinter-Programm? Nehmen wir an, ich habe diesen Code:

from Tkinter import *

def quit():
    # code to exit

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

Wie muss ich die quit-Funktion definieren, um meine Anwendung zu beenden?

60
Matt Gregory

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

from Tkinter import *

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

Erklärung:

root.quit()

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

root.destroy()

Während der destroy()-Befehl verschwindet, stoppt root.mainloop(), dh root.mainloop().

Wenn Sie also das Programm einfach beenden möchten, sollten Sie root.destroy() verwenden, da sonst die mainloop() beendet wird.

Wenn Sie jedoch eine Endlosschleife ausführen möchten und Ihr Tk-Fenster nicht zerstören möchten und nach root.mainloop()-Zeile Code ausführen möchten, sollten Sie root.quit() verwenden. 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
72
aki92
def quit()
    global root
    root.quit()

oder

def quit()
    global root
    root.destroy()
35
Matt Gregory
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()
14
kaytec

Ich glaube, Sie haben die Beendigungsfunktion von Tkinter falsch verstanden. Diese Funktion erfordert keine Definition.

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

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

Verwenden Sie dann das Suffix '.pyw', um diese Dateien zu speichern, und doppelklicken Sie auf die '.pyw'-Datei, um Ihre GUI auszuführen. Diesmal können Sie die GUI mit einem Klick auf die Schaltfläche beenden und auch finden Es wird kein unangenehmes DOS-Fenster angezeigt. (Wenn Sie die '.py'-Datei ausführen, schlägt die Quit-Funktion fehl.)

6
TreeDoNotSplit

Die übliche Methode zum Beenden eines Python-Programms:

sys.exit()

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

raise SystemExit

funktioniert gut in einem Tkinter-Programm.

4
dF.

Illumination bei Verwirrung ...

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

A) destroy () stoppt die Hauptschleife und tötet das Fenster, lässt jedoch den Python laufen

B) exit () stoppt den gesamten Vorgang

Nur um zu klären, falls jemand verpasst hat, was destroy () macht, und das OP fragte auch, wie man ein Tkinter-Programm "beendet".

3
Martin Guiles

Falls jemand seine Escape-Taste binden möchte, um die gesamte GUI zu schließen:

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

def close(event):
    sys.exit()

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

Am einfachsten klicken Sie auf die rote Schaltfläche (bei MacOS ganz links und unter Windows ganz rechts). Wenn Sie eine bestimmte Funktion an ein Schaltflächen-Widget binden möchten, können Sie Folgendes tun:

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

Oder verwenden Sie Protokollhandler und die destroy()-Methode, um die Sache etwas komplexer zu gestalten.

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()
1
Ian Gabaraev

Im idlelib.PyShell-Modul ist die Variable root vom Typ Tk als 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 unterbricht root.quit() nur die Ausführung von mainloop.

Um alle Widgets zu löschen, die zu diesem idlelib-Fenster gehören, muss root.destroy() aufgerufen werden. Dies ist die letzte Zeile der idlelib.PyShell.main()-Funktion.

1
RAD

Sie können verwenden:

root.destroy()

Oder

root.quit()

Wenn dies nicht funktioniert, ändern Sie root so, wie Ihre Variable zu Beginn Ihres Programms war

import tkinter

main = Tk()

main.destroy()

main.mainloop
1
JackHumphries

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.

1
BE Official

Ich benutze die folgenden Codes zum Verlassen 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
kourosh
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.

0
Harrison Sills
def quit1():
     root.destroy()

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

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
LenyaKap