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 :
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 :
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 :
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 :
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