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 :
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 :
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 :
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