logo oujood
🔍

Redimensionnement et fermeture Tkinter

resizable() contrôle si la fenêtre peut être redimensionnée. protocol('WM_DELETE_WINDOW') intercepte le clic sur la croix pour demander confirmation avant de fermer.

OUJOOD.COM

Par défaut, une fenêtre Tkinter est redimensionnable dans toutes les directions et se ferme immédiatement quand l'utilisateur clique sur la croix. Ces deux comportements se contrôlent séparément — resizable() pour les dimensions, protocol() pour l'interception de la fermeture.

Contrôler le redimensionnement

resizable() prend deux booléens : le premier pour la largeur, le second pour la hauteur :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.geometry("400x250")

# Les quatre combinaisons possibles :
fenetre.resizable(True,  True)   # défaut — les deux directions libres
fenetre.resizable(False, False)  # taille complètement fixe
fenetre.resizable(True,  False)  # largeur libre, hauteur fixe
fenetre.resizable(False, True)   # largeur fixe, hauteur libre

# Limites optionnelles même quand resizable=True
fenetre.minsize(300, 200)
fenetre.maxsize(800, 600)

tk.Label(fenetre, text="Essayez de redimensionner cette fenêtre",
         font=("Arial", 11)).pack(expand=True)

fenetre.mainloop()

Bloquer le redimensionnement est particulièrement cohérent quand on utilise place() avec des coordonnées absolues — les widgets restent à leur position prévue. Avec pack() et expand=True ou grid() avec des poids, laisser le redimensionnement actif est au contraire une bonne pratique.

Intercepter la fermeture avec WM_DELETE_WINDOW

Le protocole WM_DELETE_WINDOW est déclenché quand l'utilisateur clique sur la croix de fermeture. On peut l'intercepter pour demander une confirmation :

📋 Copier le code

import tkinter as tk
from tkinter import messagebox

fenetre = tk.Tk()
fenetre.title("Éditeur")
fenetre.geometry("420x280")

zone = tk.Text(fenetre, width=50, height=10)
zone.pack(padx=10, pady=10)

def confirmer_fermeture():
    if messagebox.askokcancel(
        "Quitter",
        "Des modifications non sauvegardées seront perdues.\nQuitter quand même ?"
    ):
        fenetre.destroy()  # fermeture effective
    # Si l'utilisateur clique Annuler, on ne fait rien — la fenêtre reste ouverte

# Lier la croix de fermeture à notre fonction
fenetre.protocol("WM_DELETE_WINDOW", confirmer_fermeture)

fenetre.mainloop()

Sans appel à fenetre.destroy() dans le callback, la fenêtre ne se ferme pas — c'est intentionnel et c'est ce qui permet d'annuler la fermeture. messagebox.askokcancel() fait partie du module messagebox et retourne True si l'utilisateur clique OK, False s'il clique Annuler.

Sauvegarder avant de fermer

Un pattern plus complet : vérifier si des modifications ont été faites avant de proposer la confirmation :

📋 Copier le code

import tkinter as tk
from tkinter import messagebox

fenetre = tk.Tk()
fenetre.title("Éditeur — sans modifications")
fenetre.geometry("420x260")

modifie = tk.BooleanVar(value=False)

def sur_frappe(event=None):
    if not modifie.get():
        modifie.set(True)
        fenetre.title("Éditeur — modifications non sauvegardées *")

def sauvegarder():
    modifie.set(False)
    fenetre.title("Éditeur — sauvegardé")

def quitter():
    if modifie.get():
        choix = messagebox.askyesnocancel(
            "Fermer", "Sauvegarder avant de quitter ?"
        )
        if choix is True:       # Oui
            sauvegarder()
            fenetre.destroy()
        elif choix is False:    # Non
            fenetre.destroy()
        # choix is None = Annuler → on ne ferme pas
    else:
        fenetre.destroy()

zone = tk.Text(fenetre, width=50, height=8)
zone.pack(padx=10, pady=10)
zone.bind("", sur_frappe)

tk.Button(fenetre, text="Sauvegarder", command=sauvegarder).pack()
fenetre.protocol("WM_DELETE_WINDOW", quitter)

fenetre.mainloop()

messagebox.askyesnocancel() propose trois choix — Oui, Non, Annuler — et retourne respectivement True, False et None. La comparaison explicite avec is True et is False est nécessaire car None est falsy en Python, et on ne veut pas confondre "Non" et "Annuler".

Par carabde | Mis à jour le 30 avril 2025