Comment gérer L'événement de fermeture de fenêtre dans Tkinter?
4 réponses
Tkinter, en faveur d'un mécanisme appelé gestionnaires de protocole . Ici, le terme protocole fait référence à l'interaction entre l'application et le gestionnaire de fenêtre. Le protocole le plus couramment utilisé est appelé WM_DELETE_WINDOW
, et est utilisé pour définir ce qui se passe lorsque l'utilisateur ferme explicitement une fenêtre en utilisant le gestionnaire de fenêtres.
vous pouvez utiliser la méthode protocol
pour installer un handler pour ce protocole (le widget doit être un Tk
ou Toplevel
widget):
voici un exemple concret:
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
def on_closing():
if messagebox.askokcancel("Quit", "Do you want to quit?"):
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_closing)
root.mainloop()
Matt a montré une modification classique du bouton de fermeture.
L'autre est d'avoir le bouton Fermer minimiser la fenêtre.
Vous pouvez reproduire ce comportement en ayant la iconify méthode
être le protocole méthode du deuxième argument.
voici un exemple de travail, Testé sur Windows 7:
# Python 3
import tkinter
import tkinter.scrolledtext as scrolledtext
class GUI(object):
def __init__(self):
root = self.root = tkinter.Tk()
root.title('Test')
# make the top right close button minimize (iconify) the main window
root.protocol("WM_DELETE_WINDOW", root.iconify)
# make Esc exit the program
root.bind('<Escape>', lambda e: root.destroy())
# create a menu bar with an Exit command
menubar = tkinter.Menu(root)
filemenu = tkinter.Menu(menubar, tearoff=0)
filemenu.add_command(label="Exit", command=root.destroy)
menubar.add_cascade(label="File", menu=filemenu)
root.config(menu=menubar)
# create a Text widget with a Scrollbar attached
txt = scrolledtext.ScrolledText(root, undo=True)
txt['font'] = ('consolas', '12')
txt.pack(expand=True, fill='both')
gui = GUI()
gui.root.mainloop()
Dans cet exemple, nous donnons à l'utilisateur deux nouvelles options de sortie:
le menu classic file - > Exit, ainsi que le bouton Esc .
en fonction de L'activité Tkinter, fin esp. lors de l'utilisation de Tkinter.après, arrêter cette activité avec destroy()
-- même en utilisant le protocole(), un bouton, etc. -- perturbera cette activité (erreur" en cours d'exécution") plutôt que de simplement y mettre fin. La meilleure solution dans presque tous les cas est d'utiliser un drapeau. Voici un exemple simple, stupide de la façon de l'utiliser (bien que je suis certain que la plupart d'entre vous n'en ont pas besoin! :)
from Tkinter import *
def close_window():
global running
running = False
print "Window closed"
root = Tk()
root.protocol("WM_DELETE_WINDOW", close_window)
cv = Canvas(root, width=200, height=200); cv.pack()
running = True;
# This is an endless loop stopped only by setting 'running' to 'False'
while running:
for i in range(200):
if not running: break
cv.create_oval(i,i,i+1,i+1); root.update()
ceci met fin à l'activité graphique joliment. Vous n'avez qu'à cocher running
au(x) bon (s) endroit (s).
Utiliser le closeEvent
def closeEvent(self, event):
# code to be executed