IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Controle de la fermeture de la fenêtre principale de mainloop


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    655
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 655
    Par défaut Controle de la fermeture de la fenêtre principale de mainloop
    Je peux interdire le changement de taille de la fenêtre via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Fenetre = tk.Tk()
    ...
    if __name__ == "__main__":
       ...
       Fenetre.resizable(width=False, height=False)
       ...
       Fenetre.mainloop()
    Ceci rend aussi l'icône correspondant (full screen, ...) desctivé dans la barre en haut et à droite.

    Comment peut-on aussi cacher/désactiver le bouton "X* de fermeture de cette frame?
    En effet, j'ai un bouton « quit » dans l'interface qui clos la frame mais exécute AUSSI un certain nombre d'opérations qui ne sont pas exécutée en passant par ‘X’ de la frame
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def quit():
       ...
       Fenetre.destroy()
       return
    Sous embarcadero ( Delphi pour ne pas le nommer) j'utilisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          BorderIcons := BorderIcons - [biMaximize,biSystemMenu,biHelp,biMinimize];
    Je suis parfaitement débutant en phython et je vous remercie par avance pour touts réponse

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 639
    Par défaut
    Hello,

    La fermeture d'une fenêtre via ses contrôles natifs est explicitement définie comme un protocole, et non comme un événement à proprement parler.

    https://ccia.ugr.es/mgsilvente/tkint....htm#protocols

    Le protocole qui nous intéresse ici est nommé WM_DELETE_WINDOW. C'est le message standard que le gestionnaire de fenêtres envoie à une application lorsque l'utilisateur demande sa fermeture (par exemple, en cliquant sur le 'X').

    Vous avez sur ce lien la syntaxe à utiliser : https://tedboy.github.io/python_stdl....protocol.html

    Voici un exemple de code simple,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    import tkinter as tk
    from tkinter import messagebox
    import time
     
    # --- 1. Définition de la logique de fermeture personnalisée ---
    # C'est la fonction qui sera appelée lorsque l'utilisateur tentera de fermer la fenêtre.
    def on_window_close():
        """
        Exécute une séquence de fermeture contrôlée :
        1. Affiche un message pour simuler des opérations de nettoyage.
        2. Demande une confirmation à l'utilisateur via une boîte de dialogue.
        3. Si l'utilisateur confirme, détruit la fenêtre.
        """
        print("Début de la séquence de fermeture...")
     
        # Simuler une opération de nettoyage, comme la sauvegarde de données.
        print("  -> Sauvegarde des paramètres en cours...")
        time.sleep(0.5) # Petite pause pour simuler une tâche
        print("  -> Nettoyage des ressources temporaires...")
        time.sleep(0.5) # Petite pause pour simuler une tâche
     
        # Demander confirmation à l'utilisateur.
        # messagebox.askokcancel renvoie True si l'utilisateur clique sur "OK", False sinon.
        if messagebox.askokcancel("Quitter", "Êtes-vous sûr de vouloir quitter l'application?"):
            print("Confirmation reçue. Fermeture de l'application.")
            # La méthode destroy() termine proprement la boucle mainloop et détruit tous les widgets.
            root.destroy()
        else:
            print("Fermeture annulée par l'utilisateur.")
     
    # --- 2. Configuration de la fenêtre principale ---
    # Création de l'instance de la fenêtre principale.
    root = tk.Tk()
    root.title("Contrôle de Fermeture Personnalisé")
    root.geometry("400x200")
     
    # Prérequis de l'utilisateur : désactiver le redimensionnement.
    # Le premier False concerne la largeur, le second la hauteur.
    root.resizable(False, False)
     
    # --- 3. Interception du protocole de fermeture ---
    # C'est la ligne clé. Elle indique à Tkinter d'appeler notre fonction 'on_window_close'
    # au lieu de l'action par défaut lorsque le protocole WM_DELETE_WINDOW est reçu (clic sur 'X').
    # Notez qu'on passe la référence de la fonction (on_window_close) et non son appel (on_window_close()).
    root.protocol("WM_DELETE_WINDOW", on_window_close)
     
    # --- 4. Création des widgets de l'interface ---
    # Un label pour donner des instructions à l'utilisateur.
    label_info = tk.Label(root, text="Essayez de fermer la fenêtre avec le bouton 'X'.")
    label_info.pack(pady=20)
     
    # Le bouton "Quitter" personnalisé qui exécute la MÊME logique de fermeture.
    # Cela garantit un comportement cohérent dans toute l'application.
    quit_button = tk.Button(root, text="Quitter l'Application", command=on_window_close)
    quit_button.pack(pady=10)
     
    # --- 5. Démarrage de la boucle d'événements ---
    # mainloop() affiche la fenêtre et attend les actions de l'utilisateur.
    root.mainloop()
     
    print("L'application s'est terminée correctement.")
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. QMessageBox et fermeture de la fenêtre principale
    Par france38 dans le forum Débuter
    Réponses: 9
    Dernier message: 13/01/2012, 12h08
  2. [WD10] problème lors de la Fermeture de ma fenètre principale
    Par aldama dans le forum WinDev
    Réponses: 7
    Dernier message: 29/07/2011, 02h25
  3. Réponses: 9
    Dernier message: 10/01/2011, 18h27
  4. fermeture de la fenêtre principale
    Par emmy99 dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 18/03/2008, 13h05
  5. Réponses: 6
    Dernier message: 04/07/2006, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo