Comment gérer L'événement de fermeture de fenêtre dans Tkinter?

comment gérer l'événement de fermeture de fenêtre (utilisateur cliquant sur le bouton 'X') dans un programme Python Tkinter?

85
demandé sur nbro 2008-09-21 18:46:20

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()
109
répondu Matt Gregory 2015-05-03 21:20:41

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 .

14
répondu Honest Abe 2015-05-04 04:42:28

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

0
répondu Apostolos 2018-04-12 17:50:02

Utiliser le closeEvent

def closeEvent(self, event):
# code to be executed
-14
répondu Guy Micciche 2011-05-28 20:22:39