site sans réclame PythonCont@ctS'abonner

Séquences ECMA-48 CSI

Voir manuel python Affichage

L

es séquences ECMA-48 permettent une spécification (couleur, endroit) de la sortie sur console et commencent par l'octet 27 "ESC". Cela permet notamment d'écrire à un endroit particulier de l'écran, effacer la console ou colorer caractères et fond. Cette fonctionnalité est d'origine avec GNU/Linux.

Pour effacer la console, par exemple:

echo -e "\033[2J"

ou

echo -e "\e[2J"

La documentation en Unix:

$ man console_codes

Sous Windows NT et suivant, il suffirait d'ajouter la ligne DEVICE=ANSI.SYS dans le fichier CONFIG.NT (ça n'a pas marché avec XP). On peut passer des instructions en ligne de commande avec prompt $e[2J (par exemple).

La séquence générale est ESC[#£

\033[2J efface tout l'écran
\033[H place le curseur en haut à gauche
\033[#;#H place le curseur à un point particulier de l'écran. \033[1;1H place le curseur en haut à gauche

\033[#A déplace le curseur de # caractères vers le haut
\033[#B déplace le curseur de # caractères vers le bas
\033[#C déplace le curseur de # caractères vers la droite
\033[#D déplace le curseur de # caractères vers la gauche
\033[#f place le curseur à la ligne # , première colonne
\033[#L insère # lignes à la position du curseur, repousse la suite
\033[#M efface # lignes à la position du curseur, ramène les suivantes
\033[#a place le curseur à la ligne #, colonne inchangée
\033[#;#r définit une première et une dernière ligne pour le scroll
\033[s sauvegarde la position du curseur
\033[u replace le curseur à la position préalablement sauvegardée
\033[?25l cache le curseur; \033[?25h le rétablit

Les couleurs (très limitées) se codent \033[_m le souligné doit être remplacé par:

0 réinitialisation: blanc sur fond noir
1 haute intensité
3n couleur du caractère
4n couleur du fond
5 clignotement
7 inverse-video

 Caractère      Fond
30 Gris moyen  40 Noir
31 Rouge       41 Rouge foncé
32 Vert        42 Vert foncé
33 Jaune       43 brun
34 Bleu        44 Bleu foncé
35 Magenta     45 Mauve
36 Cyan        46 Cyan foncé
37 Blanc       47 gris clair
39 Blanc gras

En python

On compose couleurs de caractère et de fond en séparant les nombres par un point virgule:

>>> print "\033[1;33;45m"+"Spam?"+"\033[0m"
Spam?

Le module ecma (expérimental) permet l'utilisation simple de ces codes:
paintat(ligne,colonne,texte,fond,"Chaine")

Voir Modules utilisateurs pour l'utilisation d'un module fait à la maison. Copiez le code ci-dessous dans un fichier nommé ecma.py.

"""module python ecma.py - 2007.02.07 - www.jchr.be - GPL-2 - Ver 1.1 2008.01.15
Enhanced (line, column, color) console printing functions using some ECMA-48 sequences"""

def colors():
  """Composition of colors: add red=1, green=2 or blue=4. You can use number or chain to choose color:
 Text:               Background: (darker than the first name - official)
0, 30 or 'grey'     0, 40 or 'black'
1, 31 or 'red'      1, 41, 'red' or 'darkred'
2, 32 or 'green'    2, 42, 'green' or 'darkgreen'
3, 33 or 'yellow'   3, 43, 'yellow' or 'brown'
4, 34 or 'blue'     4, 44, 'blue' or 'marine'
5, 35 or 'magenta'  5, 45, 'magenta' or 'purple'
6, 36 or 'cyan'     6, 46, 'cyan' or 'darkcyan'
7, 37 or 'white'    7, 47, 'white' or 'lightgrey'
9, 39 or 'bright'"""
  print """Composition of colors: add red=1, green=2 or blue=4. Use number or chain to choose a color:
 Text:               Background: (darker than the first name - official)
0, 30 or 'grey'     0, 40 or 'black'
1, 31 or 'red'      1, 41, 'red' or 'darkred'
2, 32 or 'green'    2, 42, 'green' or 'darkgreen'
3, 33 or 'yellow'   3, 43, 'yellow' or 'brown'
4, 34 or 'blue'     4, 44, 'blue' or 'marine'
5, 35 or 'magenta'  5, 45, 'magenta' or 'purple'
6, 36 or 'cyan'     6, 46, 'cyan' or 'darkcyan'
7, 37 or 'white'    7, 47, 'white' or 'lightgrey'
9, 39 or 'bright'"""

def clear(chain=''):
  """Clears the screen"""
  print "\033[2J"

def cls(chain=''):
  """Clears also the screen"""
  print "\033[2J"

def home(chain=''):
  """Writes a chain at the 'home' position (upper left corner)"""
  print "\033[H"+chain

def new(chain=''):
  """Clears the screen and writes at the home position - same as clear + printat(1,1,chain)"""
  print "\033[2J\033[H"+chain

def fgcolor(fg):
  """Used by paint() and paintat(): encodes the foreground color"""
  try:
    fg+1 # if not a number, a string:
  except:
    bg=bg.lower()
    if fg=="grey" or fg=="gray": return 30
    if fg=="red": return 31
    if fg=="green": return 32
    if fg=="yellow": return 33
    if fg=="magenta": return 34
    if fg=="magenta": return 35
    if fg=="cyan": return 36
    if fg=="white": return 37
    if fg=="bright": return 39
  else:
    if fg<10: return fg+30
    else: return fg

def bgcolor(bg):
  """Used by paint() and paintat(): encodes the background color"""
  try:
    bg+1 # if not a number, a string:
  except:
    bg=bg.lower()
    if bg=="black": return 40
    if bg=="red" or bg=="darkred": return 41
    if bg=="green" or bg=="darkgreen": return 42
    if bg=="brown" or bg=="brown": return 43
    if bg=="blue" or bg=="marine": return 44
    if bg=="magenta" or bg=="purple": return 45
    if bg=="cyan" or bg=="darkcyan": return 46
    if bg=="white" or bg=="lightgrey" or bg=="lightgray": return 47
  else:
    if bg<10: return bg+40
    else: return bg

def printat(line,column,chain=''):
  """Writes a chain at a precise line/column"""
  print "\033["+str(line)+";"+str(column)+"H"+chain

def paint(fg,bg,chain=''):
  """Writes a colored chain - call ecma.colors()"""
  print "\033["+str(fgcolor(fg))+";"+str(bgcolor(bg))+"m"+chain

def paintat(line,column,fg,bg,chain=''):
  """Writes a colored chain at a precise line/column - call ecma.colors()"""
  print "\033["+str(line)+";"+str(column)+"H"+"\033["+str(fgcolor(fg))+";"+str(bgcolor(bg))+"m"+chain