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?

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

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


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

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.


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


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.


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.


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

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.


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

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

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

Powinien zrobić, o co prosisz.


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

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

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


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.


0

Istnieje prosta, jednowierszowa odpowiedź:

Napisz - exit()w poleceniu

Otóż ​​to!


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

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


-2

Spróbuj tego:

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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.