Jak zamknąć okno Tkinter?

87

Jak zakończyć program Tkinter? Powiedzmy, że mam ten kod:

from Tkinter import *

def quit():
    # code to exit

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

Jak zdefiniować quitfunkcję zamykania mojej aplikacji?

Matt Gregory
źródło

Odpowiedzi:

120

Powinieneś użyć destroy()do zamknięcia okna tkintera.

from Tkinter import *

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

Wyjaśnienie:

root.quit()

Powyższa linia tylko Bocznikiroot.mainloop() czyli root.mainloop()nadal będzie uruchomiony w tle, jeżeli quit()polecenie jest wykonywane.

root.destroy()

Podczas gdy destroy()polecenie znika, root.mainloop()czyli root.mainloop()zatrzymuje się.

Więc jeśli chcesz po prostu zamknąć program, powinieneś użyć, root.destroy()ponieważ zatrzyma on mainloop().

Ale jeśli chcesz uruchomić jakąś nieskończoną pętlę i nie chcesz niszczyć swojego okna Tk i chcesz wykonywać kod po root.mainloop()linii, powinieneś użyć root.quit(). Dawny:

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
źródło
2
Jeśli używana jest root.quit (), w jaki sposób można później znaleźć okno w innym skrypcie do zniszczenia (aby nie używać zasobów systemowych)?
Raj
3
Twoje pierwsze stwierdzenie jest fałszywe. dzwonienie quitzniszczy wszystkie widżety; jeśli widżety zostaną zniszczone, program mainloopzakończy działanie.
Bryan Oakley,
1
Po pewnych badaniach uważam, że dotyczy to również WSZYSTKIEGO wykonywanego kodu. Więc jeśli masz mainloop () TKintera w skrypcie wiersza poleceń, użyj root.quit () a nie root.destroy (), w przeciwnym razie twój skrypt wiersza poleceń nie będzie kontynuował wykonywania kodu po mainloop (). Przetestowałem to i u mnie działa (mam świadomość, że TKinter nie jest przeznaczony do takiego projektu, niemniej jednak działa)
Alex
czy to dobre rozwiązanie, aby wielokrotnie niszczyć okno
Tkintera
40
def quit()
    root.quit()

lub

def quit()
    root.destroy()
Matt Gregory
źródło
czy ktoś wie, która metoda jest bardziej „poprawna”, czy też przypadek jednej jest bardziej czytelny niż inny
Opal
8
przepraszam, znalazłem odpowiedź i pomyślałem, że ją udostępnię. Lepiej jest go używać, root.destroy()ponieważ kończy główną pętlę programu. Zobacz: 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()
ThiefMaster
źródło
7

Zwykła metoda zamykania programu w języku Python:

sys.exit()

(do którego możesz również przekazać status wyjścia) lub

raise SystemExit

będzie działać dobrze w programie Tkinter.

dF.
źródło
3
Pytanie dotyczyło zamknięcia okna tkinter, a nie programu używającego tkinter.
kevr
7

Myślę, że źle zrozumiałeś funkcję Tkintera. Ta funkcja nie wymaga definiowania.

Najpierw powinieneś zmodyfikować swoją funkcję w następujący sposób:

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

Następnie powinieneś użyć przyrostka '.pyw', aby zapisać ten plik i dwukrotnie kliknąć plik '.pyw', aby uruchomić GUI, tym razem możesz zakończyć GUI jednym kliknięciem przycisku, a także możesz znaleźć to nie będzie nieprzyjemnego okna DOS. (Jeśli uruchomisz plik „.py”, funkcja wyjścia nie powiedzie się).

TreeDoNotSplit
źródło
5

Oświetlenie w przypadku pomyłki ...

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

A) Destroy () zatrzymuje pętlę główną i zabija okno, ale pozostawia uruchomionego Pythona

B) exit () zatrzymuje cały proces

Tylko w celu wyjaśnienia, na wypadek gdyby ktoś przeoczył, co robi destruktor (), a OP zapytał również, jak „zakończyć” program tkinter.

Martin Guiles
źródło
3

wystarczy wpisać to:

root.destroy()

i nie potrzebujesz nawet funkcji quit (), ponieważ kiedy ustawisz ją jako polecenie, zakończy działanie całego programu.

BE Official
źródło
2

W przypadku, gdy ktoś chce powiązać swój przycisk Escape z zamknięciem całego GUI:

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

def close(event):
    sys.exit()

master.bind('<Escape>',close)
master.mainloop()
Nukyi
źródło
1

W idlelib.PyShellmodule rootzmienna typu Tkjest zdefiniowana jako globalna

Na końcu PyShell.main()funkcji wywołuje root.mainloop()funkcję, która jest nieskończoną pętlą i działa do momentu przerwania pętli przez root.quit()funkcję. W związku z root.quit()tym tylko przerwie wykonaniemainloop

Aby zniszczyć wszystkie widżety związane z tym oknem idlelib, root.destroy()należy wywołać ostatnią linię idlelib.PyShell.main()funkcji.

RAD
źródło
1

Możesz użyć:

root.destroy()

Lub

root.quit()

Jeśli to nie zadziała, zmień root na taką, jaka była twoja zmienna na początku programu

import tkinter

main = Tk()

main.destroy()

main.mainloop
JackHumphries
źródło
1

Najłatwiej byłoby kliknąć czerwony przycisk (najbardziej lewy w systemie MacOS i prawy w systemie Windows). Jeśli chcesz powiązać określoną funkcję z widgetem przycisku, możesz to zrobić:

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

Lub, aby uczynić rzeczy nieco bardziej złożonymi, użyj programów obsługi protokołów i destroy()metody.

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
źródło
0
def quit1():
     root.destroy()

Button(root, text="Quit", command=quit1).pack()
root.mainloop()
user9093127
źródło
0
import sys
from Tkinter import *
def quit():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

Powinien zrobić, o co prosisz.

Harrison Sills
źródło
Hej Harrison, masz bardzo późną odpowiedź, która nie zawiera żadnych dodatkowych informacji na temat istniejących odpowiedzi. Jesteśmy bardzo wdzięczni za udział, ale Twoja odpowiedź nie dostarcza żadnych dodatkowych informacji. Spójrz na niektóre inne odpowiedzi, na przykład wykonują świetną robotę, wyjaśniając, dlaczego niektóre podejścia działają, a inne nie.
TheOneWhoPrograms
0

W przypadku pasków menu:

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
źródło
0

Używam poniższych kodów do wyjścia z okna Tkinter:

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

lub

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

lub

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

lub

from tkinter import*
root=Tk()
Button(root,text="exit",command=exit).pack()
root.mainloop()
kourosh
źródło
0

Fragment kodu poniżej. Podaję mały scenariusz.

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

Utworzyłem tutaj puste okno i dodałem opcję menu pliku w tym samym oknie (okno główne), gdzie dodałem tylko jedną opcję wyjścia .

Następnie po prostu uruchom mainloop dla roota .

Spróbuj to zrobić raz

Ozzius
źródło
0

root.destroybędzie działać.
root.quitrównież zadziała.

W moim przypadku miałem

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

Mam nadzieję, że to pomoże.

Parikh Goyal
źródło
0

Istnieje prosta, jednowierszowa odpowiedź:

Napisz - exit()w poleceniu

Otóż ​​to!

Amay Agarwal
źródło
0
from tkinter import *

def quit(root):
    root.close()

root = Tk()
root.title("Quit Window")

def quit(root):
    root.close()

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

root.mainloop()
Sarvesh
źródło
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
ppwater
Brakuje ci )w swoim, buttona także błędnego wywoływania funkcji.
Cool Cloud
-1
raise SystemExit

to zadziałało za pierwszym razem, gdzie

self.destroy()
root.destroy()

nie

Navarra Software Solutions
źródło
-2

Spróbuj tego:

from Tkinter import *
import sys
def exitApp():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=exitApp).pack()
root.mainloop()
Sam Bernstein
źródło
-4

Spróbuj tego.

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

może wyślesz parametr podobny do roota do ramki, którą zrobiłeś. więc jeśli chcesz to skończyć, musisz zadzwonić do swojego ojca, aby mógł to wszystko zamknąć, zamiast zamykać każde ze swoich dzieci.

Jose Pablo Castillo
źródło
4
Nie publikuj spekulatywnych odpowiedzi. Najlepiej publikować tylko wtedy, gdy masz sprawdzoną i możliwą do zweryfikowania odpowiedź. Jeśli masz sugestie, możesz je dodać w komentarzu.
SuperBiasedMan
Kiedy używasz klasy, self.parent.destroy () jest tym, co zadziałało w mojej sytuacji.
Zak