OUJOOD.COM
Les pages précédentes ont présenté pack(), grid() et place() séparément. La question qui vient naturellement ensuite : lequel utiliser, et pour quoi ? Il n'y a pas de réponse universelle, mais des critères qui tranchent la décision dans la grande majorité des cas.
La règle de base
Avant de choisir, posez-vous une seule question : est-ce que ma mise en page ressemble à un tableau avec des colonnes alignées ?
Si oui → grid(). Si non, est-ce que j'ai besoin de coordonnées précises ou de superposition ? Si oui → place(). Dans tous les autres cas → pack().
Voici les critères détaillés :
Quand utiliser pack()
pack() est le bon choix pour les mises en page simples et séquentielles. Il demande peu de code et gère automatiquement l'espace disponible.
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("380x260")
# pack() excelle pour une structure en zones verticales
barre_haut = tk.Frame(fenetre, bg="#37474f", height=45)
barre_haut.pack(fill="x")
tk.Label(barre_haut, text="Mon application", bg="#37474f", fg="white",
font=("Arial", 12, "bold")).pack(side="left", padx=15, pady=10)
contenu = tk.Frame(fenetre, bg="white")
contenu.pack(fill="both", expand=True, padx=10, pady=10)
tk.Label(contenu, text="Zone de contenu", bg="white").pack(pady=40)
barre_bas = tk.Frame(fenetre, bg="#eceff1", height=40)
barre_bas.pack(fill="x", side="bottom")
tk.Button(barre_bas, text="Fermer").pack(side="right", padx=10, pady=6)
fenetre.mainloop()
Cas d'usage typiques pour pack() : structure haut/centre/bas, barre de boutons horizontale, pile de widgets verticaux, sidebar + zone principale côte à côte.
Quand utiliser grid()
grid() s'impose dès que l'alignement en colonnes est important — formulaires, calculatrices, tableaux de bord.
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Formulaire grid()")
fenetre.geometry("340x200")
champs = [("Prénom :", 0), ("Nom :", 1), ("Téléphone :", 2), ("Email :", 3)]
for label_text, row in champs:
tk.Label(fenetre, text=label_text).grid(
row=row, column=0, sticky="e", padx=12, pady=6
)
tk.Entry(fenetre, width=22).grid(row=row, column=1, padx=5)
tk.Button(fenetre, text="Envoyer").grid(
row=4, column=0, columnspan=2, pady=12
)
fenetre.mainloop()
Cas d'usage typiques pour grid() : formulaires avec labels et champs, clavier de calculatrice, tableaux de configuration, interfaces avec colonnes multiples.
Quand utiliser place()
place() est réservé aux situations où les deux autres ne suffisent pas : interfaces à taille fixe, superpositions, splash screens.
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("380x220")
fenetre.resizable(False, False)
# place() est idéal pour un écran de démarrage avec fond
fond = tk.Frame(fenetre, bg="#0d1b2a")
fond.place(x=0, y=0, relwidth=1, relheight=1)
tk.Label(fond, text="Bienvenue", font=("Arial", 22, "bold"),
fg="#e0e0e0", bg="#0d1b2a").place(relx=0.5, rely=0.3, anchor="center")
tk.Label(fond, text="Version 1.0.0", font=("Arial", 10),
fg="#78909c", bg="#0d1b2a").place(relx=0.5, rely=0.55, anchor="center")
tk.Button(fond, text="Commencer", font=("Arial", 11),
bg="#1565c0", fg="white", padx=18, pady=6,
relief="flat").place(relx=0.5, rely=0.78, anchor="center")
fenetre.mainloop()
Cas d'usage typiques pour place() : écrans de démarrage, badges ou tooltips superposés, interfaces de jeu à taille fixe, positionnement sur un Canvas.
La règle des conteneurs mélangés
Un point souvent mal compris : on peut utiliser les trois gestionnaires dans une même application, à condition de ne pas les mélanger dans le même conteneur. Un Frame peut utiliser pack() dans la fenêtre principale, pendant que ses enfants utilisent grid(). C'est même la technique recommandée pour les interfaces complexes : pack() pour la structure globale, grid() à l'intérieur des zones qui en ont besoin.
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("360x220")
# Structure globale avec pack()
titre = tk.Label(fenetre, text="Formulaire de contact",
font=("Arial", 13, "bold"), bg="#e3f2fd")
titre.pack(fill="x", pady=5)
# Frame interne avec grid() pour le formulaire
frame_form = tk.Frame(fenetre)
frame_form.pack(padx=20, pady=5)
tk.Label(frame_form, text="Nom :").grid(row=0, column=0, sticky="e", pady=5)
tk.Entry(frame_form, width=22).grid(row=0, column=1, padx=8)
tk.Label(frame_form, text="Email :").grid(row=1, column=0, sticky="e", pady=5)
tk.Entry(frame_form, width=22).grid(row=1, column=1, padx=8)
# Bouton en bas avec pack()
tk.Button(fenetre, text="Envoyer").pack(pady=10)
fenetre.mainloop()
Cette combinaison pack() global + grid() local est le schéma le plus courant dans les projets Tkinter réels. Vous la retrouverez dans le projet calculatrice et le gestionnaire de tâches.
Par carabde | Mis à jour le 30 avril 2025