Come chiudo una finestra di tkinter?
Domanda
Come posso terminare un programma Tkinter? Diciamo che ho questo codice:
from Tkinter import *
def quit():
# code to exit
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()
Come devo definire la funzione quit
per uscire dalla mia applicazione?
Soluzione
Dovresti usare destroy ()
per chiudere una finestra di tkinter.
from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
root.mainloop()
Spiegazione:
root.quit()
La riga sopra è solo Bypass root.mainloop ()
cioè root.mainloop ()
sarà ancora in esecuzione in background se viene eseguito il comando quit ()
.
root.destroy()
Mentre il comando destroy ()
scompare root.mainloop ()
ovvero root.mainloop ()
si interrompe.
Quindi, se vuoi semplicemente uscire dal programma, dovresti usare root.destroy ()
poiché fermerà mainloop ()
.
Ma se vuoi eseguire un ciclo infinito e non vuoi distruggere la tua finestra Tk e vuoi eseguire un po 'di codice dopo la riga root.mainloop ()
, allora dovresti usare root.quit ()
. Es:
from Tkinter import *
def quit():
global root
root.quit()
root = Tk()
while True:
Button(root, text="Quit", command=quit).pack()
root.mainloop()
#do something
Altri suggerimenti
def quit()
root.quit()
o
def quit()
root.destroy()
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()
Penso che tu abbia capito erroneamente la funzione di chiusura di Tkinter. Questa funzione non richiede di definire.
Innanzitutto, è necessario modificare la funzione come segue:
from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.quit).pack()
root.mainloop()
Quindi, dovresti usare il suffisso '.pyw' per salvare questi file e fare doppio clic sul file '.pyw' per eseguire la tua GUI, questa volta puoi terminare la GUI con un clic del pulsante e puoi scopri anche che non ci saranno finestre DOS spiacevoli. (Se si esegue il file '.py', la funzione quit fallirà.)
Il solito metodo per uscire da un programma Python:
sys.exit()
(a cui è anche possibile passare uno stato di uscita) o
raise SystemExit
funzionerà bene in un programma Tkinter.
Illuminazione in caso di confusione ...
def quit(self):
self.destroy()
exit()
A) destroy () arresta il mainloop e uccide la finestra, ma lascia python in esecuzione
B) exit () arresta l'intero processo
Giusto per chiarire nel caso in cui qualcuno avesse perso ciò che stava distruggendo () e l'OP chiedeva anche come "terminare". un programma tkinter.
Nel modulo idlelib.PyShell
, la variabile root
di tipo Tk
è definita come globale
Alla fine della funzione PyShell.main ()
chiama la funzione root.mainloop ()
che è un ciclo infinito e funziona fino a quando il ciclo viene interrotto da < code> root.quit () . Pertanto, root.quit ()
interromperà solo l'esecuzione di mainloop
Per distruggere tutti i widget relativi a quella finestra idlelib, è necessario chiamare root.destroy ()
, che è l'ultima riga di idlelib.PyShell.main () funzione.
Puoi usare:
root.destroy()
o
root.quit()
Se ciò non funziona, cambia root in qualunque sia stata la tua variabile all'inizio del programma
import tkinter
main = Tk()
main.destroy()
main.mainloop
Il modo più semplice sarebbe quello di fare clic sul pulsante rosso (all'estrema sinistra su macOS e all'estrema destra su Windows). Se vuoi associare una funzione specifica a un widget pulsante, puoi farlo:
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()
Oppure, per rendere le cose un po 'più complesse, usa i gestori di protocollo e il metodo destroy ()
.
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()
Nel caso in cui qualcuno desideri associare il pulsante Escape alla chiusura dell'intera GUI:
master = Tk()
master.title("Python")
def close(event):
sys.exit()
master.bind('<Escape>',close)
master.mainloop()
devi solo digitare questo:
root.destroy()
e non hai nemmeno bisogno della funzione quit () perché quando lo imposti come comando, si chiuderà l'intero programma.
def quit1():
root.destroy()
Button(root, text="Quit", command=quit1).pack()
root.mainloop()
import sys
from Tkinter import *
def quit():
sys.exit()
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()
Dovrebbe fare quello che stai chiedendo.
Per le barre dei 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()
Uso i codici seguenti per uscire dalla finestra di Tkinter:
from tkinter import*
root=Tk()
root.bind("<Escape>",lambda q:root.destroy())
root.mainloop()
o
from tkinter import*
root=Tk()
Button(root,text="exit",command=root.destroy).pack()
root.mainloop()
o
from tkinter import*
root=Tk()
Button(root,text="quit",command=quit).pack()
root.mainloop()
o
from tkinter import*
root=Tk()
Button(root,text="exit",command=exit).pack()
root.mainloop()
Prova questo:
from Tkinter import *
import sys
def exitApp():
sys.exit()
root = Tk()
Button(root, text="Quit", command=exitApp).pack()
root.mainloop()
prova questo.
self.parent.destroy()
self.parent.quit()
forse invii il parametro root come a un frame che hai fatto. quindi se vuoi finirlo devi chiamare tuo padre in modo che possa chiudere tutto, invece di chiudere ognuno dei suoi figli.