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 dois-je définir la fonction quit
pour quitter mon application?
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 juste Contourne la root.mainloop()
i.e root.mainloop()
fonctionnera toujours en arrière-plan si la commande quit()
est exécutée.
root.destroy()
Alors que la commande destroy()
disparaît root.mainloop()
i.e root.mainloop()
s’arrête.
Donc, comme vous voulez juste quitter le programme, vous devriez 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()
, vous devez utiliser 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
def quit()
global root
root.quit()
ou
def quit()
global root
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 terminer l’interface graphique en cliquant sur le bouton. 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 passer un statut de sortie) ou
raise SystemExit
fonctionnera bien 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.
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()
Le moyen le plus simple consiste à 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, vous pouvez le faire:
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()
Dans le module idlelib.PyShell
, la variable root
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 la fonction 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 correspond à la dernière ligne de la fonction idlelib.PyShell.main()
.
Vous pouvez utiliser:
root.destroy()
Ou
root.quit()
Si cela ne fonctionne pas, changez root pour quelle que soit votre variable au début de votre programme
import tkinter
main = Tk()
main.destroy()
main.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é.
J'utilise les codes ci-dessous pour la sortie de la fenêtre de 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()
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.
def quit1():
root.destroy()
Button(root, text="Quit", command=quit1).pack()
root.mainloop()
Pour les barres de 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()