associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

CoresNoTerminal

Receita de como utilizar cores no terminal

  • Algumas vezes queremos utilizar cores no terminal e sempre temos que lembrar os códigos complicados das cores, esta página é visa auxiliar nesta tarefa.

    Esta página surgiu de um post do Marco Carvalho na lista python-brasil@yahoogrupos.com.br , ou seja, todos os créditos a ele. ;)

Como faço para alterar a cor de texto no shell do Linux?

Usando seqüências de escape ANSI:

   1 >>> print '\033[31m'+'Isto eh vermelho'+'\033[0;0m'
   2 Isto eh vermelho
   3 >>> print '\033[32m'+'Isto eh verde'+'\033[0;0m'
   4 Isto eh verde
   5 >>> print '\033[42m'+'\033[1m'+'\033[33m'+'Isto eh amarelo negrito com fundo verde'+'\033[0;0m'
   6 Isto eh amarelo negrito com fundo verde
   7 >>>

O último exemplo pode ser simplificado assim:

   1 >>> print '\033[42;1;33m'+'Isto eh amarelo negrito com fundo verde'+'\033[0;0m'
   2 Isto eh amarelo negrito com fundo verde
   3 >>>

Para facilitar, segue a tabela de seqüência de escape ANSI:

   1 vermelho = '\033[31m'
   2 verde = '\033[32m'
   3 azul = '\033[34m'
   4 
   5 ciano = '\033[36m'
   6 magenta = '\033[35m'
   7 amarelo = '\033[33m'
   8 preto = '\033[30m'
   9 
  10 branco = '\033[37m'
  11 
  12 restaura cor original = '\033[0;0m'
  13 negrito = '\033[1m'
  14 reverso = '\033[2m'
  15 
  16 fundo preto = '\033[40m'
  17 fundo vermelho = '\033[41m'
  18 fundo verde = '\033[42m'
  19 fundo amarelo = '\033[43m'
  20 fundo azul = '\033[44m'
  21 fundo magenta = '\033[45m'
  22 fundo ciano = '\033[46m'
  23 fundo branco = '\033[47m'

No windows não funciona. Existe alguma maneira?

  • O DOS não suporta ANSI diretamente, precisa do driver ANSI.SYS no config.sys

 device=ANSI.SYS
  • A solução fácil é utilizar o conjunto de funções da biblioteca ctypes disponível no Python 2.5 ou acima, veja o exemplo:

   1 # -*- coding: utf-8 -*-
   2 """
   3 0 = Black          1 = Blue            2 = Green
   4 3 = Aqua           4 = Red             5 = Purple
   5 6 = Yellow         7 = White           8 = Gray
   6 9 = Light Blue     10 = Light Green    11 = Light Aqua
   7 12 = Light Red     13 = Light Purple   14 = Light Yellow
   8 
   9 Este código é baseado no software Python Wikipedia Bot, distribuído pela MIT license.
  10 
  11 """
  12 import ctypes, sys
  13 
  14 def printColorizedInWindows(text, color):
  15     std_out_handle = ctypes.windll.kernel32.GetStdHandle(-11)
  16     for i in range(0, len(color)):
  17         ctypes.windll.kernel32.SetConsoleTextAttribute(std_out_handle, color[i])
  18         sys.stdout.write(text)
  19     # cor padrão é 7, white
  20     ctypes.windll.kernel32.SetConsoleTextAttribute(std_out_handle, 7)
  21     
  22 if __name__ == "__main__":
  23     text = u"Imprimindo texto colorido no MS-DOS"
  24     color = [1] # número da cor do texto
  25     printColorizedInWindows(text, color)

Testes

  • Aproveitando, só de brincadeira, fiz uma conversão (bem porca por sinal) de um [1] script do Aurélio Marinho Jargas (vulgo Verde) que imprime todas as cores ANSI no terminal Linux.

   1 #**** cores.py ****
   2 
   3 for letra in ["0","1","2","3","4","5","6","7"]:
   4     for bold in ['',';1']:
   5         for fundo in ["0","1","2","3","4","5","6","7"]:
   6             seq="4" + fundo + ";3" + letra
   7             saida = "\033["+ seq + bold + "m" + (seq+bold).center(8) + "\033[m"
   8             print "%s" % saida,
   9         print

Abaixo o mesmo script porém melhorado pelo amigo Rodrigo Cacilhas que gentilmente o compartilha conosco:

   1 #**** cores.py ****
   2 
   3 import sys
   4 
   5 for frente in xrange(8):
   6     for bold in '', ";1":
   7         for fundo in xrange(8):
   8             seq="4%d;3%d%s" % (fundo, frente, bold)
   9             saida = "\033[%sm %s" % (seq, seq.ljust(8))
  10             sys.stdout.write(saida)
  11         sys.stdout.write("\033[0m\n")


Volta para o CookBook.