Aller au contenu principal

Mise en forme de la console

Réalisé avec l'IA

Il existe 2 façons de changer l'apparence du texte ou de contrôler le curseur dans la console: avec des codes spéciaux intégrés au langage, ou avec une librairie externe qui simplifie leur utilisation.

Codes ANSI (natif)​

La console comprend des codes spéciaux, appelés codes ANSI (ou codes d'échappement), qui permettent de changer l'apparence du texte ou de contrôler le curseur. Ces codes commencent tous par le caractère d'échappement \033 suivi de [.

Compatibilité

Ces codes fonctionnent dans le terminal intégré de VS Code. Un ancien terminal Windows (cmd.exe) peut ne pas les supporter correctement.

Réinitialiser​

\033[0m retire tout le formatage (couleur, gras, etc.) appliqué précédemment. Il faut toujours réinitialiser à la fin d'une chaîne mise en forme, sinon le formatage continue de s'appliquer au texte suivant.

print(f"\033[1mTexte en gras\033[0m et texte normal")

Style de texte​

  • \033[1m Gras
  • \033[3m Italique
  • \033[4m Souligné
  • \033[9m Barré

Exemple:

print("\033[1mGras\033[0m")
print("\033[3mItalique\033[0m")
print("\033[4mSouligné\033[0m")
print("\033[9mBarré\033[0m")

Couleur du texte​

  • \033[30m Noir
  • \033[31m Rouge
  • \033[32m Vert
  • \033[33m Jaune
  • \033[34m Bleu
  • \033[35m Magenta
  • \033[36m Cyan
  • \033[37m Blanc

Exemple:

print("\033[31mTexte rouge\033[0m")
print("\033[32mTexte vert\033[0m")

Couleur d'arrière-plan​

Les mêmes couleurs, mais en ajoutant 10 au code:

  • \033[40m Noir
  • \033[41m Rouge
  • \033[42m Vert
  • \033[43m Jaune
  • \033[44m Bleu
  • \033[45m Magenta
  • \033[46m Cyan
  • \033[47m Blanc

Exemple:

print("\033[41mTexte avec fond rouge\033[0m")

Vous pouvez combiner plusieurs codes en les séparant par un point-virgule:

print("\033[1;31;44mGras, texte rouge, fond bleu\033[0m")

Vider la console​

\033[2J efface tout le contenu de la console (sans déplacer le curseur). Combinez le avec \033[H pour aussi replacer le curseur en haut à gauche:

print("\033[2J\033[H", end='')
Terminal sticky scroll

Dans les paramètres de VS Code, désactivez terminal.integrated.stickyScroll.enabled (cherchez "terminal sticky scroll"). Sinon, la première ligne affichée après avoir vidé la console peut rester cachée sous la barre collante.

Positionner le curseur​

  • \033[H Déplace le curseur en haut à gauche (ligne 1, colonne 1)
  • \033[{ligne};{colonne}H Déplace le curseur à la position donnée (la ligne et la colonne commencent à 1)
  • \033[{n}A Déplace le curseur de n lignes vers le haut
  • \033[{n}B Déplace le curseur de n lignes vers le bas
  • \033[{n}C Déplace le curseur de n colonnes vers la droite
  • \033[{n}D Déplace le curseur de n colonnes vers la gauche

Exemple, afficher un texte à la ligne 5, colonne 10:

print("\033[5;10HBonjour", end='')
💡 Le input et le curseur

input() affiche son message et l'écho de votre saisie à la position actuelle du curseur: si vous l'avez déplacé avant, c'est là que ça apparaît. Cacher le curseur n'affecte pas input(), la saisie fonctionne normalement, seul le clignotement n'est plus visible.

Cacher le curseur​

  • \033[?25l Cache le curseur
  • \033[?25h Réaffiche le curseur

Utile pour éviter que le curseur clignotant nuise à l'affichage d'une interface console.

print("\033[?25l", end='') # Cache le curseur

# ... affichage de votre interface ...

print("\033[?25h", end='') # Réaffiche le curseur avant de quitter

Effacer une ligne​

\033[2K efface le contenu de la ligne où se trouve le curseur, sans le déplacer.

Exemple: interface qui se met à jour​

En combinant le déplacement du curseur en haut et l'affichage par-dessus, on peut faire une interface qui se met à jour sans faire défiler la console:

import time

print("\033[2J\033[?25l", end='') # Vide la console et cache le curseur

for i in range(5):
print("\033[H", end='') # Replace le curseur en haut, sans vider la console
print(f"Compteur: {i} ")
time.sleep(1)

print("\033[0m\033[?25h", end='') # Réinitialise le formatage et réaffiche le curseur

Avec la librairie blessed​

Les codes ANSI fonctionnent, mais ils sont difficiles à mémoriser et à relire. La librairie blessed offre les mêmes fonctionnalités avec un code plus lisible.

Installation​

Dans le terminal:

pip install blessed

Puis dans votre code, créez un Terminal une seule fois, il vous donne accès à tout le reste:

from blessed import Terminal

term = Terminal()

Style et couleurs​

print(term.bold("Texte en gras"))
print(term.italic("Texte en italique"))
print(term.underline("Texte souligné"))
print(term.red("Texte rouge"))
print(term.on_red("Texte avec fond rouge"))
print(term.bold_red_on_blue("Gras, texte rouge, fond bleu"))

Pas besoin de réinitialiser à la fin: term s'en occupe automatiquement.

Vider la console​

print(term.clear, end='')

Positionner le curseur​

term.move_xy(colonne, ligne) déplace le curseur à la position donnée. Contrairement aux codes ANSI, la colonne et la ligne commencent à 0.

print(term.move_xy(9, 4) + "Bonjour", end='')

Cacher le curseur​

print(term.hide_cursor, end='') # Cache le curseur

# ... affichage de votre interface ...

print(term.normal_cursor, end='') # Réaffiche le curseur avant de quitter

Exemple: interface qui se met à jour​

Le même exemple que précédemment, avec blessed:

import time
from blessed import Terminal

term = Terminal()

print(term.clear + term.hide_cursor, end='')

for i in range(5):
print(term.home, end='')
print(f"Compteur: {i} ")
time.sleep(1)

print(term.normal_cursor, end='')

Détection automatique du terminal​

Contrairement aux codes ANSI écrits à la main, blessed vérifie les capacités réelles du terminal utilisé. Si la sortie n'est pas un vrai terminal (par exemple si vous redirigez l'affichage vers un fichier), les codes de style ne sont simplement pas ajoutés, au lieu de polluer le fichier avec des caractères illisibles.

Taille du terminal​

print(f"Largeur: {term.width}, hauteur: {term.height}")

Utile pour adapter votre affichage à la taille actuelle de la fenêtre.

Lire une touche sans enter​

input() attend toujours un enter. Avec term.cbreak() et term.inkey(), blessed permet de lire une seule touche immédiatement, sans attendre l'enter, et ce sur Windows, Mac et Linux:

print("Appuyez sur une touche...")

with term.cbreak():
touche = term.inkey()

print(f"Vous avez appuyé sur: {touche}")

Repositionner temporairement le curseur​

term.location(colonne, ligne) déplace le curseur, affiche quelque chose, puis remet le curseur à sa position précédente à la fin du bloc:

print("Ligne courante")

with term.location(0, 0):
print("Affiché en haut à gauche, temporairement")

print("On continue ici, comme si de rien n'était")

Écran alternatif (fullscreen)​

term.fullscreen() bascule vers un écran séparé (comme le fait less ou un éditeur en mode texte), puis restaure l'écran original à la fin du bloc:

import time

with term.fullscreen():
print("Cet affichage est dans un écran séparé")
time.sleep(2)

print("De retour à l'écran original, comme s'il ne s'était rien passé")

Plus de couleurs​

En plus des 8 couleurs de base, blessed permet d'utiliser 256 couleurs ou des couleurs RGB:

print(term.color(202)("Une des 256 couleurs"))
print(term.color_rgb(255, 100, 0)("Une couleur RGB précise"))