OUJOOD.COM
place() est le troisième gestionnaire de mise en page de Tkinter. À la différence de pack() et grid() qui calculent les positions automatiquement, place() vous laisse définir des coordonnées exactes. Cette liberté a un prix : l'interface ne s'adapte pas au redimensionnement de la fenêtre. Il faut donc savoir quand l'utiliser — et quand l'éviter.
Positionnement absolu avec x et y
Les coordonnées sont en pixels depuis le coin supérieur gauche du conteneur :
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("place() absolu")
fenetre.geometry("400x250")
fenetre.resizable(False, False) # fenêtre fixe, cohérent avec place()
tk.Label(fenetre, text="Nom :", bg="#f0f0f0").place(x=40, y=50)
tk.Entry(fenetre, width=22).place(x=110, y=48)
tk.Label(fenetre, text="Email :", bg="#f0f0f0").place(x=40, y=90)
tk.Entry(fenetre, width=22).place(x=110, y=88)
tk.Button(fenetre, text="Valider", width=10).place(x=240, y=140)
tk.Button(fenetre, text="Annuler", width=10).place(x=140, y=140)
fenetre.mainloop()
Notez resizable(False, False) : quand on utilise place() avec des coordonnées absolues, il est cohérent d'empêcher le redimensionnement. Si la fenêtre peut être agrandie, les widgets restent collés à leur position d'origine et ne suivent pas — le résultat est visuellement cassé.
Positionnement relatif avec relx et rely
Les paramètres relx et rely acceptent des valeurs entre 0.0 et 1.0, exprimant une proportion de la taille du conteneur. C'est ce qui permet à place() de s'adapter partiellement au redimensionnement :
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("place() relatif")
fenetre.geometry("400x250")
# Centrer un widget quelle que soit la taille de la fenêtre
label = tk.Label(
fenetre,
text="Toujours au centre",
font=("Arial", 14),
bg="#bbdefb",
padx=20,
pady=10
)
label.place(relx=0.5, rely=0.5, anchor="center")
# Bouton collé en bas à droite
tk.Button(fenetre, text="Fermer").place(relx=1.0, rely=1.0, anchor="se", x=-10, y=-10)
fenetre.mainloop()
relx=0.5, rely=0.5, anchor="center" centre parfaitement le widget dans la fenêtre, peu importe les dimensions. anchor précise quel point du widget correspond aux coordonnées données — ici, son centre. On peut combiner relx avec un décalage absolu x pour un ajustement fin.
Superposer des widgets
C'est le vrai point fort de place() : empiler des widgets les uns sur les autres, ce que ni pack() ni grid() ne savent faire nativement :
import tkinter as tk
fenetre = tk.Tk()
fenetre.geometry("360x200")
# Image de fond simulée par un Frame coloré
fond = tk.Frame(fenetre, bg="#1a237e")
fond.place(x=0, y=0, relwidth=1, relheight=1) # couvre toute la fenêtre
# Widgets par-dessus le fond
tk.Label(fond, text="Titre de l'application", font=("Arial", 16, "bold"),
fg="white", bg="#1a237e").place(relx=0.5, rely=0.3, anchor="center")
tk.Button(fond, text="Démarrer", font=("Arial", 11),
bg="#f57f17", fg="white", padx=20, pady=6).place(relx=0.5, rely=0.65, anchor="center")
fenetre.mainloop()
relwidth=1, relheight=1 font que le Frame occupe 100% de la largeur et de la hauteur du conteneur, s'adaptant automatiquement si la fenêtre est redimensionnée. Les widgets placés par-dessus utilisent relx et rely pour rester centrés.
Pour savoir si place() est le bon choix pour votre cas ou si pack() / grid() conviendraient mieux, la page pack, grid ou place : lequel choisir ? donne des critères concrets.
Par carabde | Mis à jour le 30 avril 2025