Comment fermer une fenêtre tkinter?
Question
Comment puis-je terminer un programme Tkinter? Disons que j'ai ce code:
from Tkinter import *
def quit():
# code to exit
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()
Comment définir la fonction quit
pour quitter mon application?
La solution
Vous devez utiliser destroy ()
pour fermer une fenêtre tkinter.
from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
root.mainloop()
Explication:
root.quit()
La ligne ci-dessus ne fait que contourner le root.mainloop ()
, c'est-à-dire root.mainloop ()
sera toujours exécuté en arrière-plan si la commande> quit ()
est exécutée.
root.destroy()
Pendant que la commande destroy ()
disparaît root.mainloop ()
i.e root.mainloop ()
s'arrête.
Donc, comme vous voulez juste quitter le programme, vous devez utiliser root.destroy ()
pour arrêter le mainloop ()
.
Mais si vous voulez exécuter une boucle infinie et que vous ne voulez pas détruire votre fenêtre Tk et que vous voulez exécuter du code après la ligne root.mainloop ()
, utilisez . 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
Autres conseils
def quit()
root.quit()
ou
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()
Je pense que vous avez mal compris la fonction de démission de Tkinter. Cette fonction ne vous oblige pas à définir.
Tout d'abord, vous devez modifier votre fonction comme suit:
from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.quit).pack()
root.mainloop()
Ensuite, vous devez utiliser le suffixe ".pyw" pour enregistrer ces fichiers, puis double-cliquer sur le fichier ".pyw" pour exécuter votre interface graphique. Cette fois, vous pouvez fermer l'interface graphique en cliquant sur le bouton, puis vous pouvez constatez également qu’il n’y aura pas de fenêtre DOS désagréable. (Si vous exécutez le fichier '.py', la fonction de fermeture échouera.)
La méthode habituelle pour quitter un programme Python:
sys.exit()
(auquel vous pouvez également transmettre un statut de sortie) ou
raise SystemExit
fonctionnera correctement dans un programme Tkinter.
Illumination en cas de confusion ...
def quit(self):
self.destroy()
exit()
A) destroy () arrête la boucle principale et tue la fenêtre, mais laisse python actif
B) exit () arrête tout le processus
Juste pour clarifier au cas où quelqu'un manquerait ce que destroy () faisait, et le PO a également demandé comment "mettre fin". un programme tkinter.
Dans le module idlelib.PyShell
, la variable racine
de type Tk
est définie comme étant globale
À la fin de la fonction PyShell.main ()
, elle appelle la fonction root.mainloop ()
qui est une boucle infinie et s'exécute jusqu'à ce que la boucle soit interrompue par < code> root.quit () . Par conséquent, root.quit ()
n'interrompra que l'exécution de mainloop
Pour détruire tous les widgets appartenant à cette fenêtre idlelib, vous devez appeler root.destroy ()
, qui constitue la dernière ligne de idlelib.PyShell.main ()
fonction.
Vous pouvez utiliser:
root.destroy()
Ou
root.quit()
Si cela ne fonctionne pas, remplacez root par ce que votre variable était au début de votre programme
import tkinter
main = Tk()
main.destroy()
main.mainloop
Le plus simple serait de cliquer sur le bouton rouge (le plus à gauche sur macOS et le plus à droite sur Windows). Si vous souhaitez lier une fonction spécifique à un widget de bouton, procédez comme suit:
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()
Ou, pour rendre les choses un peu plus complexes, utilisez des gestionnaires de protocole et la méthode 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()
Si quelqu'un souhaite lier son bouton Échap à la fermeture de la totalité de l'interface graphique:
master = Tk()
master.title("Python")
def close(event):
sys.exit()
master.bind('<Escape>',close)
master.mainloop()
il vous suffit de taper ceci:
root.destroy()
et vous n'avez même pas besoin de la fonction quit () car si vous définissez cette commande comme commande, le programme entier sera quitté.
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()
Devrait faire ce que vous demandez.
Pour les barres de menus:
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()
J'utilise les codes ci-dessous pour la sortie de la fenêtre Tkinter:
from tkinter import*
root=Tk()
root.bind("<Escape>",lambda q:root.destroy())
root.mainloop()
ou
from tkinter import*
root=Tk()
Button(root,text="exit",command=root.destroy).pack()
root.mainloop()
ou
from tkinter import*
root=Tk()
Button(root,text="quit",command=quit).pack()
root.mainloop()
ou
from tkinter import*
root=Tk()
Button(root,text="exit",command=exit).pack()
root.mainloop()
Essayez ceci:
from Tkinter import *
import sys
def exitApp():
sys.exit()
root = Tk()
Button(root, text="Quit", command=exitApp).pack()
root.mainloop()
essayez ceci.
self.parent.destroy()
self.parent.quit()
peut-être que vous envoyez un paramètre de type racine à un cadre que vous avez créé. donc si vous voulez le terminer, vous devez appeler votre père pour qu'il puisse tout fermer, au lieu de fermer chacun de ses enfants.