web-dev-qa-db-fra.com

Comment fermer une fenêtre tkinter?

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?

60
Matt Gregory

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
72
aki92
def quit()
    global root
    root.quit()

ou

def quit()
    global root
    root.destroy()
35
Matt Gregory
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()
14
kaytec

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

6
TreeDoNotSplit

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.

4
dF.

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.

3
Martin Guiles

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

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()
1
Ian Gabaraev

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

1
RAD

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
1
JackHumphries

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

1
BE Official

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()
0
kourosh
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.

0
Harrison Sills
def quit1():
     root.destroy()

Button(root, text="Quit", command=quit1).pack()
root.mainloop()
0
user9093127

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