OUJOOD.COM
Là où pack() empile les widgets en séquence, grid() les positionne dans un tableau invisible de lignes et de colonnes. C'est le gestionnaire naturel pour les formulaires, les calculatrices ou tout ce qui demande un alignement précis en colonnes.
Principe de base : row et column
Chaque widget reçoit une position sous forme de numéro de ligne et de colonne. La numérotation commence à 0 :
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Formulaire simple")
fenetre.geometry("320x180")
# Colonne 0 : labels — Colonne 1 : champs
tk.Label(fenetre, text="Prénom :").grid(row=0, column=0, sticky="e", padx=10, pady=8)
tk.Entry(fenetre, width=22).grid(row=0, column=1, padx=5)
tk.Label(fenetre, text="Nom :").grid(row=1, column=0, sticky="e", padx=10, pady=8)
tk.Entry(fenetre, width=22).grid(row=1, column=1, padx=5)
tk.Label(fenetre, text="Email :").grid(row=2, column=0, sticky="e", padx=10, pady=8)
tk.Entry(fenetre, width=22).grid(row=2, column=1, padx=5)
tk.Button(fenetre, text="Envoyer").grid(row=3, column=1, sticky="e", padx=5, pady=10)
fenetre.mainloop()
sticky="e" colle le widget sur le bord est (droite) de sa cellule — ce qui aligne naturellement les labels à droite, en face de leurs champs. Sans sticky, chaque widget est centré dans sa cellule.
sticky : les huit directions
sticky accepte les points cardinaux seuls ou combinés. La combinaison la plus courante est "ew" pour étirer horizontalement, ou "nsew" pour remplir toute la cellule :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("360x160")
tk.Label(fenetre, text="Message :").grid(row=0, column=0, sticky="ne", padx=10, pady=10)
# La zone texte s'étire pour remplir sa cellule
zone = tk.Text(fenetre, width=28, height=4)
zone.grid(row=0, column=1, sticky="nsew", padx=5, pady=10)
# La colonne 1 s'étire quand la fenêtre est agrandie
fenetre.columnconfigure(1, weight=1)
fenetre.mainloop()
sticky="ne" sur le label le colle en haut à droite de sa cellule — il reste aligné avec le haut de la zone de texte même si la cellule grandit. sticky="nsew" sur la zone texte l'étire dans les quatre directions.
columnspan et rowspan
Un widget peut occuper plusieurs colonnes ou plusieurs lignes en même temps :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("360x200")
tk.Label(fenetre, text="Titre du formulaire", font=("Arial", 13, "bold")).grid(
row=0, column=0, columnspan=2, pady=12 # s'étale sur 2 colonnes
)
tk.Label(fenetre, text="Nom :").grid(row=1, column=0, sticky="e", padx=10, pady=6)
tk.Entry(fenetre, width=22).grid(row=1, column=1, padx=5)
tk.Label(fenetre, text="Ville :").grid(row=2, column=0, sticky="e", padx=10, pady=6)
tk.Entry(fenetre, width=22).grid(row=2, column=1, padx=5)
# Bouton centré sur les 2 colonnes
tk.Button(fenetre, text="Valider", width=16).grid(
row=3, column=0, columnspan=2, pady=12
)
fenetre.mainloop()
columnconfigure et rowconfigure
Par défaut, les colonnes et lignes de la grille ne s'adaptent pas quand la fenêtre est redimensionnée. columnconfigure() et rowconfigure() avec weight corrigent ça :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("400x200")
zone = tk.Text(fenetre, width=40, height=6)
zone.grid(row=0, column=0, sticky="nsew", padx=10, pady=10)
# La ligne 0 et la colonne 0 prennent tout l'espace disponible
fenetre.rowconfigure(0, weight=1)
fenetre.columnconfigure(0, weight=1)
fenetre.mainloop()
Le paramètre weight est un ratio : si deux colonnes ont respectivement weight=1 et weight=2, la seconde prend deux fois plus d'espace lors du redimensionnement. C'est l'équivalent de flex-grow en CSS.
Pour les cas où ni pack() ni grid() ne conviennent — positionnement absolu pixel par pixel — la page sur place() couvre cette option. Et si vous hésitez encore entre les trois, la page pack, grid ou place : lequel choisir ? donne les critères de décision.
Par carabde | Mis à jour le 30 avril 2025