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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top