OUJOOD.COM
Tkinter propose trois gestionnaires de mise en page : pack(), grid() et place(). pack() est le plus simple des trois — il empile les widgets dans une direction et calcule leur position automatiquement. C'est souvent le premier qu'on utilise, et il suffit pour beaucoup d'interfaces.
Fonctionnement de base
Sans paramètre, pack() empile les widgets verticalement du haut vers le bas :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("300x200")
tk.Label(fenetre, text="Premier", bg="#f9a825", width=20).pack()
tk.Label(fenetre, text="Deuxième", bg="#66bb6a", width=20).pack()
tk.Label(fenetre, text="Troisième",bg="#42a5f5", width=20).pack()
fenetre.mainloop()
Chaque appel à pack() place le widget sous le précédent. La fenêtre se redimensionne pour s'adapter au contenu — sauf si vous avez fixé une taille avec geometry().
Le paramètre side
side contrôle de quel côté le widget est collé dans l'espace restant. Les valeurs possibles sont "top" (défaut), "bottom", "left" et "right" :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("360x120")
# Trois boutons côte à côte
tk.Button(fenetre, text="Gauche", bg="#ef5350", fg="white").pack(side="left", padx=10, pady=20)
tk.Button(fenetre, text="Centre", bg="#66bb6a", fg="white").pack(side="left", padx=10, pady=20)
tk.Button(fenetre, text="Droite", bg="#42a5f5", fg="white").pack(side="right", padx=10, pady=20)
fenetre.mainloop()
Les deux premiers boutons sont packés à gauche et s'accumulent de gauche à droite. Le troisième est collé à droite. L'espace central reste vide — pack() ne répartit pas automatiquement l'espace comme le ferait une flexbox CSS.
fill et expand
fill étire le widget pour remplir l'espace alloué. expand demande à pack() d'allouer plus d'espace au widget quand la fenêtre est agrandie :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("400x250")
# Barre fixe en haut
tk.Label(fenetre, text="En-tête", bg="#1565c0", fg="white").pack(fill="x")
# Zone centrale qui s'étire dans toutes les directions
tk.Label(fenetre, text="Contenu principal", bg="#e3f2fd").pack(
fill="both", expand=True, padx=10, pady=10
)
# Barre fixe en bas
tk.Label(fenetre, text="Pied de page", bg="#1565c0", fg="white").pack(fill="x", side="bottom")
fenetre.mainloop()
fill="x" étire horizontalement. fill="y" étire verticalement. fill="both" étire dans les deux sens. Sans expand=True, l'espace supplémentaire lors du redimensionnement de la fenêtre reste vide plutôt que d'être donné au widget.
padx, pady et anchor
Ces trois paramètres affinent le positionnement :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("350x200")
# padx et pady : espace externe autour du widget
tk.Button(fenetre, text="Avec marges").pack(padx=30, pady=15)
# anchor : colle le widget d'un côté sans le remplir
tk.Label(fenetre, text="Aligné à gauche", bg="#fff9c4").pack(anchor="w", padx=10)
tk.Label(fenetre, text="Centré", bg="#c8e6c9").pack(anchor="center")
tk.Label(fenetre, text="Aligné à droite", bg="#ffccbc").pack(anchor="e", padx=10)
fenetre.mainloop()
anchor utilise les points cardinaux : "n", "s", "e", "w" et leurs combinaisons ("nw", "se"...), plus "center". La différence avec fill : anchor positionne le widget dans son espace alloué sans le redimensionner, alors que fill l'étire.
Pour des mises en page en colonnes ou en grilles, pack() montre ses limites — c'est là qu'intervient grid(). La page pack, grid ou place : lequel choisir ? aide à décider selon la situation.
Par carabde | Mis à jour le 30 avril 2025