Un texte qui disparaît, une image mal alignée ou une interface qui reste figée peuvent rendre une petite application Tkinter étonnamment frustrante. Le widget Label sert à afficher du texte, des informations d’état ou une image, mais ses options de mise en page et de mise à jour méritent quelques explications pratiques.
Les points essentiels pour bien utiliser Label dans Tkinter
- Label affiche du texte ou une image, mais ne reçoit pas directement les saisies.
- textvariable permet de modifier automatiquement le contenu visible.
- anchor, justify et wraplength contrôlent l’alignement et le retour à la ligne.
- tk.Label offre un contrôle visuel direct, tandis que ttk.Label s’intègre mieux aux thèmes modernes.
- Une image PhotoImage doit rester référencée, sinon elle peut ne plus s’afficher.

Comprendre le rôle du widget Label
Dans Tkinter, Label est le composant prévu pour présenter une information à l’utilisateur. Il peut afficher un titre, une consigne, un résultat de calcul, un message d’erreur ou une icône. Son rôle est principalement informatif : contrairement à Entry, il ne sert pas à saisir du texte.
La création de base tient en quelques lignes. Le premier argument indique le conteneur parent, puis les options définissent le contenu et l’apparence.
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Exemple avec Label")
texte = tk.Label(fenetre, text="Bonjour depuis Tkinter")
texte.pack(padx=20, pady=20)
fenetre.mainloop()
La méthode pack() place ici le widget dans la fenêtre. Pour une interface plus structurée, j’utilise souvent grid(), notamment lorsque les étiquettes accompagnent des champs de formulaire. Le choix du gestionnaire de géométrie dépend surtout de la structure de l’interface, pas du widget lui-même.
Créer une mise en page propre avec les options principales
Un Label peut rapidement devenir illisible si son texte est trop long ou si son alignement est laissé au hasard. Les options les plus utiles sont font, fg, bg, anchor, justify et wraplength.
| Option | Utilité | Exemple |
|---|---|---|
text |
Définit le contenu affiché | text="Connexion réussie" |
font |
Choisit la police, la taille et le style | font=("Arial", 16, "bold") |
fg |
Change la couleur du texte | fg="green" |
bg |
Change la couleur d’arrière-plan | bg="#f2f2f2" |
anchor |
Positionne le contenu dans l’espace du widget | anchor="w" |
justify |
Aligne les lignes d’un texte multiligne | justify="left" |
wraplength |
Impose une largeur avant le retour à la ligne | wraplength=280 |
anchor et justify sont souvent confondus. Le premier place le bloc dans le widget, avec des valeurs comme "w", "center" ou "e". Le second organise les lignes entre elles. Pour un message long aligné à gauche, je combine généralement anchor="w", justify="left" et une valeur de wraplength.
message = tk.Label(
fenetre,
text="Cette phrase sera automatiquement répartie sur plusieurs lignes.",
font=("Arial", 12),
fg="#333333",
bg="#f7f7f7",
wraplength=280,
justify="left",
anchor="w",
padx=12,
pady=10
)
message.pack(fill="x", padx=20, pady=20)
Les options padx et pady ajoutent de l’espace autour du contenu à l’intérieur du widget. Pour l’espace extérieur, je préfère régler les marges dans pack() ou grid(). Cette distinction évite les interfaces où le texte semble comprimé malgré des marges importantes.
Mettre à jour le texte sans recréer le widget
Pour afficher une valeur qui change, deux méthodes sont possibles. On peut modifier directement le widget avec configure(), ou associer une variable Tkinter grâce à StringVar. Dans une petite application, les deux approches fonctionnent, mais StringVar devient plus pratique dès que plusieurs actions doivent partager le même état.
import tkinter as tk
fenetre = tk.Tk()
fenetre.title("Label dynamique")
compteur = 0
texte_compteur = tk.StringVar(value="Clics : 0")
def incrementer():
global compteur
compteur += 1
texte_compteur.set(f"Clics : {compteur}")
label = tk.Label(
fenetre,
textvariable=texte_compteur,
font=("Arial", 15)
)
label.pack(padx=20, pady=15)
bouton = tk.Button(fenetre, text="Incrémenter", command=incrementer)
bouton.pack(pady=10)
fenetre.mainloop()
Dans cet exemple, l’appel à set() actualise automatiquement le texte visible. Pour une modification ponctuelle, label.configure(text="Nouveau message") est souvent plus lisible. J’évite surtout de détruire puis de recréer le widget à chaque changement, car cela complique la mise en page et peut provoquer des effets visuels inutiles.
Un autre détail compte dans les interfaces réactives. Le callback d’un bouton doit être transmis sans parenthèses, avec command=incrementer. Écrire command=incrementer() exécuterait la fonction immédiatement au démarrage, ce qui est l’une des erreurs les plus fréquentes chez les débutants.
Afficher une image et gérer les interactions
Un label peut afficher une image créée avec PhotoImage. C’est utile pour un logo, une icône d’état ou une illustration légère. Tkinter reste toutefois sensible à la durée de vie de l’objet image : si aucune référence Python ne le conserve, l’image peut disparaître de la fenêtre.
import tkinter as tk
fenetre = tk.Tk()
icone = tk.PhotoImage(file="logo.png")
label_image = tk.Label(fenetre, image=icone)
label_image.pack(padx=20, pady=20)
fenetre.mainloop()
La variable icone doit rester accessible pendant toute la durée d’affichage. Dans une classe, je la stocke par exemple dans self.icone. Pour combiner image et texte, l’option compound indique si l’image doit se trouver à gauche, à droite, au-dessus ou au-dessous du texte.
label = tk.Label(
fenetre,
image=icone,
text="Application prête",
compound="left",
padx=10
)
label.pack()
Un Label n’a pas d’option command comme un bouton. Il peut néanmoins réagir à un clic avec bind(). Je l’utilise pour créer un lien interne, une zone d’aide ou une action discrète, en changeant aussi le curseur pour signaler que l’élément est interactif.
def afficher_aide(event):
print("Aide ouverte")
aide = tk.Label(
fenetre,
text="Afficher l’aide",
fg="blue",
cursor="hand2"
)
aide.pack()
aide.bind("", afficher_aide)
Cette technique fonctionne, mais elle ne remplace pas toujours un bouton. Pour une action importante, Button reste plus clair et plus accessible, notamment au clavier et pour les utilisateurs qui s’attendent à un contrôle standard.
Choisir entre tk.Label et ttk.Label
Tkinter propose deux variantes courantes. tk.Label donne accès à des réglages visuels directs comme bg, fg, relief et borderwidth. ttk.Label appartient à la bibliothèque de widgets thématiques et s’intègre généralement mieux à une interface moderne.
| Critère | tk.Label |
ttk.Label |
|---|---|---|
| Personnalisation rapide | Très simple | Plutôt basée sur les styles |
| Couleurs directes |
fg et bg disponibles |
À gérer principalement avec ttk.Style
|
| Aspect natif | Variable selon la plateforme | Meilleure cohérence avec les thèmes Tk |
| Usage conseillé | Prototypes, interfaces très personnalisées | Applications structurées et cohérentes |
Pour une interface avec plusieurs composants, je privilégie souvent ttk.Label et un style centralisé. Cela évite de disperser les couleurs dans tout le code. À l’inverse, pour un message d’erreur rouge ou un bandeau avec un fond spécifique, tk.Label reste souvent plus rapide à régler.
import tkinter as tk
from tkinter import ttk
fenetre = tk.Tk()
style = ttk.Style()
style.configure("Titre.TLabel", font=("Arial", 18, "bold"))
titre = ttk.Label(
fenetre,
text="Tableau de bord", style="Titre.TLabel"
)
titre.pack(padx=20, pady=20)
fenetre.mainloop()
Éviter les erreurs qui rendent Label imprévisible
La première erreur consiste à utiliser plusieurs gestionnaires de géométrie dans le même parent. Mélanger pack() et grid() dans une même fenêtre peut produire une exception ou une disposition difficile à contrôler. J’organise plutôt l’interface avec des Frame séparés, chacun utilisant son propre gestionnaire.
Une autre source de problèmes vient des dimensions. width et height ne se comportent pas toujours comme des pixels selon le type de widget et le contenu affiché. Pour obtenir une largeur visuelle fiable, wraplength et l’expansion du conteneur sont souvent plus efficaces que des dimensions rigides.
Il faut aussi vérifier la différence entre text et textvariable. Si les deux sont fournis, la variable associée prend le contrôle du contenu. Pour éviter les incohérences, je choisis une seule source de vérité et je la modifie toujours avec configure() ou avec StringVar.set().
- Utiliser un seul gestionnaire de géométrie par parent.
- Conserver les références des objets
PhotoImage. - Prévoir un retour à la ligne pour les textes longs.
- Employer
ttk.Stylepour harmoniser plusieurs labels. - Réserver les clics sur un label aux interactions évidentes et signalées.
Le bon réflexe pour un Label fiable et lisible
Je commence toujours par donner au label une responsabilité simple : afficher une information clairement. Je règle ensuite l’alignement, la largeur et les marges avant d’ajouter des couleurs ou des effets, car la lisibilité compte davantage que la décoration.
Pour un texte fixe, text suffit. Pour une information dynamique, StringVar rend le code plus propre. Pour une application complète, ttk.Label offre une base cohérente, tandis que tk.Label reste un excellent choix lorsqu’un contrôle précis de l’apparence est nécessaire.
Avec ces quelques règles, le widget devient un élément discret mais solide de l’interface. Il affiche le bon contenu, au bon endroit, sans recréation inutile ni mise en page fragile.