Mise en forme de la console
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 [.
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[1mGras\033[3mItalique\033[4mSouligné\033[9mBarré
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[30mNoir\033[31mRouge\033[32mVert\033[33mJaune\033[34mBleu\033[35mMagenta\033[36mCyan\033[37mBlanc
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[40mNoir\033[41mRouge\033[42mVert\033[43mJaune\033[44mBleu\033[45mMagenta\033[46mCyan\033[47mBlanc
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='')
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[HDéplace le curseur en haut à gauche (ligne 1, colonne 1)\033[{ligne};{colonne}HDéplace le curseur à la position donnée (la ligne et la colonne commencent à 1)\033[{n}ADéplace le curseur de n lignes vers le haut\033[{n}BDéplace le curseur de n lignes vers le bas\033[{n}CDéplace le curseur de n colonnes vers la droite\033[{n}DDéplace le curseur de n colonnes vers la gauche
Exemple, afficher un texte à la ligne 5, colonne 10:
print("\033[5;10HBonjour", end='')
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[?25lCache le curseur\033[?25hRé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"))