web-dev-qa-db-fra.com

Remplacement du contrôle du bouton "X" de Tkinter (le bouton qui ferme la fenêtre)

Lorsque l'utilisateur appuie sur un closeButton que j'ai créé, certaines tâches sont effectuées avant de quitter. Cependant, si l'utilisateur clique sur [X] bouton en haut à droite de la fenêtre pour fermer la fenêtre, je ne peux pas effectuer ces tâches.

Comment puis-je remplacer ce qui se passe lorsque l'utilisateur clique sur [X] bouton?

26
erkangur

Il semble que votre fenêtre de sauvegarde doit être modale .

S'il s'agit d'une fenêtre de sauvegarde de base, pourquoi réinventez-vous la roue? Tk a un tkFileDialog à cet effet.


Si vous voulez remplacer le comportement par défaut de destruction de la fenêtre, vous pouvez simplement faire:

root.protocol('WM_DELETE_WINDOW', doSomething)  # root is your root window

def doSomething():
    # check if saving
    # if not:
    root.destroy()

De cette façon, vous pouvez intercepter l'appel destroy() lorsque quelqu'un ferme la fenêtre (par tous les moyens) et faites ce que vous voulez.

42
Nick Presta

En utilisant la méthode procotol, nous pouvons redéfinir le WM_DELETE_WINDOW protocole en lui associant l'appel à une fonction, dans ce cas la fonction est appelée on_exit:

import tkinter as tk
from tkinter import messagebox


class App(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Handling WM_DELETE_WINDOW protocol")
        self.geometry("500x300+500+200")
        self.make_topmost()
        self.protocol("WM_DELETE_WINDOW", self.on_exit)

    def on_exit(self):
        """When you click to exit, this function is called"""
        if messagebox.askyesno("Exit", "Do you want to quit the application?"):
            self.destroy()

    def center(self):
        """Centers this Tk window"""
        self.eval('tk::PlaceWindow %s center' % app.winfo_pathname(app.winfo_id()))

    def make_topmost(self):
        """Makes this window the topmost window"""
        self.lift()
        self.attributes("-topmost", 1)
        self.attributes("-topmost", 0)


if __name__ == '__main__':
    App().mainloop()
6
The Demz

La commande que vous recherchez est wm_protocol, lui donnant "WM_DELETE_WINDOW" comme protocole de liaison. Il vous permet de définir une procédure à appeler lorsque le gestionnaire de fenêtres ferme la fenêtre (ce qui se passe lorsque vous cliquez sur [x]).

2
Bryan Oakley

J'ai trouvé une référence sur Tkinter ici . Ce n'est pas parfait, mais couvre presque tout ce dont j'ai jamais eu besoin. Je pense que la section 30.3 (Types d'événements) aide, elle nous dit qu'il y a un événement "Destroy" pour les widgets. Je suppose que .bind () ing vos travaux de sauvegarde à cet événement de votre fenêtre principale devrait faire l'affaire.

Vous pouvez également appeler mainwindow.overrideredirect (True) (section 24), qui désactive la réduction, le redimensionnement et la fermeture via les boutons de la barre de titre.

1
user395760