logo oujood
🔍

Le widget Text Tkinter

Text est la zone de saisie multiligne de Tkinter. Plus puissant qu'Entry, il supporte la mise en forme, les images et le défilement.

OUJOOD.COM

Quand un champ Entry d'une seule ligne ne suffit plus — zone de commentaires, éditeur de texte, console de log — c'est le widget Text qu'il faut utiliser. Il gère plusieurs lignes, supporte une mise en forme partielle via des tags, et s'associe naturellement à une barre de défilement.

Créer une zone de texte et y insérer du contenu

Les indices du widget Text fonctionnent différemment de Entry : ils sont au format "ligne.colonne", où les lignes commencent à 1 et les colonnes à 0 :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.title("Widget Text")
fenetre.geometry("420x280")

zone = tk.Text(fenetre, width=50, height=10, font=("Arial", 11))
zone.pack(padx=10, pady=10)

# Insérer du texte à la position 1.0 (ligne 1, colonne 0)
zone.insert("1.0", "Première ligne de texte\n")
zone.insert(tk.END, "Deuxième ligne ajoutée à la fin\n")
zone.insert(tk.END, "Troisième ligne")

fenetre.mainloop()

tk.END désigne la fin du contenu actuel — c'est l'indice qu'on utilise presque toujours pour ajouter du texte à la suite. "1.0" désigne le tout début : ligne 1, position 0.

Lire et effacer le contenu

La méthode get() prend deux indices. Pour récupérer tout le contenu, on utilise "1.0" et tk.END :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.geometry("400x220")

zone = tk.Text(fenetre, width=45, height=7)
zone.pack(padx=10, pady=10)

def lire():
    contenu = zone.get("1.0", tk.END)
    print(repr(contenu))  # get() ajoute toujours un \n final

def effacer():
    zone.delete("1.0", tk.END)

frame_btn = tk.Frame(fenetre)
frame_btn.pack()
tk.Button(frame_btn, text="Lire", command=lire).pack(side="left", padx=5)
tk.Button(frame_btn, text="Effacer", command=effacer).pack(side="left", padx=5)

fenetre.mainloop()

Attention : get("1.0", tk.END) retourne toujours le texte avec un caractère \n supplémentaire à la fin. Si vous comparez ou traitez le résultat, pensez à appeler .strip() ou [:-1] pour l'enlever.

Mettre en forme avec des tags

Les tags permettent d'appliquer une mise en forme à des portions du texte — gras, couleur, police différente :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.geometry("420x200")

zone = tk.Text(fenetre, width=50, height=7, font=("Arial", 11))
zone.pack(padx=10, pady=10)

# Définir les styles via tag_configure
zone.tag_configure("gras",    font=("Arial", 11, "bold"))
zone.tag_configure("rouge",   foreground="red")
zone.tag_configure("surlig",  background="#fff176")

zone.insert(tk.END, "Texte normal, ")
zone.insert(tk.END, "texte en gras", "gras")
zone.insert(tk.END, ", texte en ")
zone.insert(tk.END, "rouge", "rouge")
zone.insert(tk.END, " et texte ")
zone.insert(tk.END, "surligné", "surlig")
zone.insert(tk.END, ".")

fenetre.mainloop()

On définit d'abord le style avec tag_configure(), puis on l'applique en passant le nom du tag comme troisième argument à insert(). Un même tag peut être appliqué à plusieurs endroits, et un morceau de texte peut avoir plusieurs tags simultanément.

Zone de texte avec défilement

Dès que le contenu peut dépasser la taille visible, une Scrollbar s'impose. Le raccordement entre les deux widgets se fait via les méthodes yscrollcommand et yview :

📋 Copier le code

import tkinter as tk

fenetre = tk.Tk()
fenetre.title("Text + Scrollbar")
fenetre.geometry("420x250")

frame = tk.Frame(fenetre)
frame.pack(fill="both", expand=True, padx=10, pady=10)

scrollbar = tk.Scrollbar(frame)
scrollbar.pack(side="right", fill="y")

zone = tk.Text(frame, width=48, height=10, yscrollcommand=scrollbar.set)
zone.pack(side="left", fill="both", expand=True)

scrollbar.config(command=zone.yview)

# Remplir avec du contenu pour tester le défilement
for i in range(1, 31):
    zone.insert(tk.END, f"Ligne {i} — contenu de test\n")

fenetre.mainloop()

Le Frame intermédiaire sert à placer la scrollbar à droite du champ texte avec pack(side="right"). Sans lui, il faudrait passer par grid() pour les positionner côte à côte — ce qui est aussi une option valable, décrite dans la page sur le gestionnaire grid().

Pour rendre la zone en lecture seule — une console de log par exemple — ajoutez state="disabled" après avoir inséré le contenu. Pour y ajouter du texte ensuite, repassez temporairement en state="normal", insérez, puis repassez en "disabled".

Par carabde | Mis à jour le 30 avril 2025