Question Imprimer dans le terminal avec des couleurs?


Comment puis-je produire du texte en couleur sur le terminal, en Python? Quel est le meilleur symbole Unicode pour représenter un bloc solide?


1515
2017-11-13 18:58


origine


Réponses:


Cela dépend quelque peu de la plateforme sur laquelle vous êtes. La manière la plus courante de le faire est d'imprimer des séquences d'échappement ANSI. Pour un exemple simple, voici un code python du scripts de construction de blender:

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

Pour utiliser un code comme celui-ci, vous pouvez faire quelque chose comme

print bcolors.WARNING + "Warning: No active frommets remain. Continue?" 
      + bcolors.ENDC

Cela fonctionnera sur les unix incluant OS X, linux et windows (à condition d'utiliser ANSICONou dans Windows 10 à condition d'activer Émulation VT100). Il existe des codes ansi pour régler la couleur, déplacer le curseur et plus encore.

Si vous allez vous compliquer avec cela (et cela ressemble à ce que vous êtes si vous écrivez un jeu), vous devriez regarder dans le module "curses", qui gère beaucoup de parties compliquées de cela pour vous. le Python Curses HowTO est une bonne introduction.

Si vous n'utilisez pas l'ASCII étendu (c'est-à-dire pas sur un PC), vous êtes bloqué avec les caractères ascii en dessous de 127, et '#' ou '@' est probablement votre meilleur pari pour un bloc. Si vous pouvez vous assurer que votre terminal utilise IBM jeu de caractères ascii étendu, vous avez beaucoup plus d'options. Les caractères 176, 177, 178 et 219 sont les "caractères de bloc".

Certains programmes modernes basés sur le texte, tels que "Dwarf Fortress", émulent le mode texte dans un mode graphique et utilisent des images de la police PC classique. Vous pouvez trouver certaines de ces bitmaps que vous pouvez utiliser sur le Dwarf Fortress Wiki voir (carreaux créés par l'utilisateur).

le Concours de démonstration en mode texte a plus de ressources pour faire des graphiques en mode texte.

Hmm .. Je pense avoir un peu emporté sur cette réponse. Je suis en train de planifier un jeu d'aventure basé sur du texte épique, cependant. Bonne chance avec votre texte en couleur!


1340
2017-11-13 19:25



Je suis surpris que personne n'a mentionné le Python module de couleur. L'utilisation est assez simple:

from termcolor import colored

print colored('hello', 'red'), colored('world', 'green')

Cependant, il se peut que ce ne soit pas assez sophistiqué pour la programmation du jeu et les "blocs de couleur" que vous voulez faire ...


553
2017-11-16 07:31



La réponse est Colorama pour tous les coloris multiplateformes en Python.

Un exemple d'écran Python 3.6: example screenshot


477
2017-07-26 07:07



Imprime une chaîne qui commence une couleur / un style, puis la chaîne, puis termine le changement de couleur / style avec '\x1b[0m':

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

Success with green background example

Obtenir une table des options de formatage pour le texte du shell avec le code suivant:

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

Exemple de lumière sur noir (complet)

enter image description here

Exemple de Dark-on-Light (partiel)

top part of output


280
2018-02-14 17:56



Vous voulez en savoir plus sur les séquences d'échappement ANSI. Voici un bref exemple:

CSI="\x1B["
print CSI+"31;40m" + "Colored Text" + CSI + "0m"

Pour plus d'informations voir http://en.wikipedia.org/wiki/ANSI_escape_code

Pour un caractère de bloc, essayez un caractère unicode comme \ u2588:

print u"\u2588"

Mettre tous ensemble:

print CSI+"31;40m" + u"\u2588" + CSI + "0m"

71
2017-11-13 19:22



Définissez une chaîne qui commence une couleur et une chaîne qui termine la couleur, puis imprimez votre texte avec la chaîne de début au début et la chaîne de fin à la fin.

CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)

Cela produit ce qui suit dans bash, dans urxvtavec un schéma de couleur Zenburn:

output colors

Grâce à l'expérimentation, nous pouvons obtenir plus de couleurs:

color matrix

Remarque: \33[5m et \33[6m clignotent.

De cette façon, nous pouvons créer une collection complète de couleurs:

CEND      = '\33[0m'
CBOLD     = '\33[1m'
CITALIC   = '\33[3m'
CURL      = '\33[4m'
CBLINK    = '\33[5m'
CBLINK2   = '\33[6m'
CSELECTED = '\33[7m'

CBLACK  = '\33[30m'
CRED    = '\33[31m'
CGREEN  = '\33[32m'
CYELLOW = '\33[33m'
CBLUE   = '\33[34m'
CVIOLET = '\33[35m'
CBEIGE  = '\33[36m'
CWHITE  = '\33[37m'

CBLACKBG  = '\33[40m'
CREDBG    = '\33[41m'
CGREENBG  = '\33[42m'
CYELLOWBG = '\33[43m'
CBLUEBG   = '\33[44m'
CVIOLETBG = '\33[45m'
CBEIGEBG  = '\33[46m'
CWHITEBG  = '\33[47m'

CGREY    = '\33[90m'
CRED2    = '\33[91m'
CGREEN2  = '\33[92m'
CYELLOW2 = '\33[93m'
CBLUE2   = '\33[94m'
CVIOLET2 = '\33[95m'
CBEIGE2  = '\33[96m'
CWHITE2  = '\33[97m'

CGREYBG    = '\33[100m'
CREDBG2    = '\33[101m'
CGREENBG2  = '\33[102m'
CYELLOWBG2 = '\33[103m'
CBLUEBG2   = '\33[104m'
CVIOLETBG2 = '\33[105m'
CBEIGEBG2  = '\33[106m'
CWHITEBG2  = '\33[107m'

Voici le code pour générer le test:

x = 0
for i in range(24):
  colors = ""
  for j in range(5):
    code = str(x+j)
    colors = colors + "\33[" + code + "m\\33[" + code + "m\033[0m "
  print(colors)
  x=x+5

65
2017-09-12 14:00



Ma façon préférée est avec le Bénédictions bibliothèque (divulgation complète: je l'ai écrit). Par exemple:

from blessings import Terminal

t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')

Pour imprimer des briques colorées, le moyen le plus fiable consiste à imprimer des espaces avec des couleurs de fond. J'utilise cette technique pour dessiner la barre de progression nez-progressif:

print t.on_green(' ')

Vous pouvez également imprimer dans des endroits spécifiques:

with t.location(0, 5):
    print t.on_yellow(' ')

Si vous devez utiliser d'autres capacités de terminal au cours de votre partie, vous pouvez le faire également. Vous pouvez utiliser le formatage de chaîne standard de Python pour le rendre lisible:

print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)

La bonne chose à propos de Blessings, c'est qu'il fait de son mieux pour travailler sur toutes sortes de terminaux, et pas seulement ceux (essentiellement communs) de couleur ANSI. Il maintient également les séquences d'échappement illisibles hors de votre code tout en restant concis à utiliser. S'amuser!


59
2017-12-18 00:32