3147 votes

Comment imprimer un texte coloré sur le terminal

Comment puis-je envoyer du texte coloré au terminal en Python ?

10 votes

Vous devriez spécifier quelques informations supplémentaires afin d'obtenir de meilleures réponses : multiplateforme ? les modules externes sont-ils acceptés ?

3 votes

IPython le fait, multiplateforme. Vous voyez ce qu'ils utilisent ?

1 votes

Ce symbole ferait un super bloc coloré : Le seul problème est qu'il s'agit d'un ASCII étendu, vous pourriez peut-être le faire fonctionner en utilisant http://stackoverflow.com/questions/8465226/using-extended-as‌​cii-codes-with-pytho‌​n

2823voto

joeld Points 5569

Cela dépend quelque peu de la plateforme sur laquelle vous vous trouvez. La façon la plus courante de procéder est d'imprimer les séquences d'échappement ANSI. Pour un exemple simple, voici du code Python provenant de l'application Construction de Blender scripts :

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKCYAN = '\033[96m'
    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)

Ou, avec Python 3.6+ :

print(f"{bcolors.WARNING}Warning: No active frommets remain. Continue?{bcolors.ENDC}")

Cela fonctionnera sur les systèmes unixes, y compris OS X, Linux et Windows (à condition d'utiliser ANSICON ou dans Windows 10, à condition d'activer Émulation VT100 ). Il existe des codes ANSI pour le réglage de la couleur, le déplacement du curseur, etc.

Si vous comptez vous compliquer la vie (et il semble que ce soit le cas si vous écrivez un jeu), vous devriez vous pencher sur la " malédictions "qui gère pour vous une grande partie des parties compliquées de ce processus. Le site HowTO sur les malédictions en Python est une bonne introduction.

Si vous n'utilisez pas l'ASCII étendu (c'est-à-dire si vous n'êtes pas sur un PC), vous êtes coincé avec les caractères ASCII inférieurs à 127, et '#' ou '@' est probablement votre meilleur choix pour un bloc. Si vous pouvez vous assurer que votre terminal utilise un code 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 blocage".

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

Le site Concours de démonstration en mode texte dispose de plus de ressources pour réaliser des graphiques en mode texte.

0 votes

Mais supposons que mon invite par défaut n'est pas noire - pensez-vous qu'il soit possible de faire en sorte que python se rouvre après ces astuces ?

0 votes

Un autre outil utile est UNDERLINE = '\033[4m' . Que se passe-t-il si ansi.sys est désactivé sous Windows et vous essayez d'utiliser ces séquences d'échappement ANSI ?

14 votes

Sous Linux, vous pouvez utiliser tput , comme ça car il en résulte un code plus portable.

1167voto

Samat Jain Points 3859

Il y a aussi le Module Python termcolor . L'utilisation est assez simple :

from termcolor import colored

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

Ou en Python 3 :

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

Cependant, il n'est peut-être pas assez sophistiqué pour la programmation de jeux et les "blocs colorés" que vous voulez faire...

Pour que les codes ANSI fonctionnent sous Windows, exécutez d'abord

os.system('color')

4 votes

Puisqu'il émet des codes ANSI, fonctionne-t-il sous Windows (consoles DOS) si ansi.sys est chargé ? support.microsoft.com/kb/101875

45 votes

Je viens de remarquer qu'à partir du 13/01/2011, il est maintenant sous licence MIT.

18 votes

N'a pas de unittests (contrairement à colorama) et n'a pas été mis à jour depuis 2011

1060voto

priestc Points 5002

La réponse est Colorama pour toutes les colorations multiplateformes en Python.

Il prend en charge Python 3.5+ ainsi que Python 2.7.

Et à partir de janvier 2021, il est maintenu.

Exemple de capture d'écran : example screenshot

493 votes

En tant qu'auteur de Colorama, merci pour la mention @nbv4. Je vais essayer de clarifier un peu : Colorama a pour but de permettre aux programmes Python d'imprimer du texte coloré pour terminal sur toutes les plateformes, en utilisant les mêmes codes ANSI que ceux décrits dans de nombreuses autres réponses sur cette page. Sous Windows, Colorama retire ces caractères ANSI de stdout et les convertit en appels win32 équivalents pour du texte coloré. Sur les autres plateformes, Colorama ne fait rien. Ainsi, vous pouvez utiliser des codes ANSI, ou des modules comme Termcolor, et avec Colorama, ils "fonctionnent" sur toutes les plateformes. C'est l'idée, en tout cas.

6 votes

Jonathan, c'est vraiment une bibliothèque géniale ! La possibilité de colorer la sortie Python sur plusieurs plateformes est vraiment très agréable et utile. Je fournis des outils pour une bibliothèque qui colorie sa propre console. Je peux rediriger la sortie de cette console vers le terminal et coloriser la sortie. Maintenant, je peux même monter la bibliothèque et laisser l'utilisateur choisir les couleurs. Cela permettra aux daltoniens de régler les choses pour qu'ils puissent voir la sortie correctement. Merci

94 votes

Cela devrait être dans la bibliothèque standard... Le support des couleurs sur plusieurs plateformes est important, je pense.

115voto

Bryan Oakley Points 63365

Vous voulez apprendre 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 _Code d'échappement ANSI_ .

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

print(u"\u2588")

Tout mettre en place :

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

4 votes

Essayez def d(*v): return '\x1B['+';'.join(map(str, v))+'m' puis print ' '.join([d(k,i)+str(i%10)+d(0) for i in range(30,38)+range(40,48) for k in range(2)])

0 votes

Quel est le sens de reset ici ?

0 votes

J'ai essayé cette solution. Quel est l'objectif de "31;40m" y "0m" ?

70voto

Erik Rose Points 301

Ma façon préférée est avec le Bénédictions (pour toute révél révélation : c'est moi qui l'ai écrite). 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 est d'imprimer des espaces avec des couleurs de fond. J'utilise cette technique pour dessiner la barre de progression dans nez-progressif :

print t.on_green(' ')

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

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

Si vous devez modifier les capacités d'autres terminaux au cours de votre jeu, vous pouvez également le faire. Vous pouvez utiliser le formatage standard des chaînes de caractères de Python pour que le jeu reste lisible :

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

Ce qui est bien avec Blessings, c'est qu'il fait de son mieux pour fonctionner sur toutes sortes de terminaux, et pas seulement sur les terminaux de couleur ANSI (très répandus). Il évite également les séquences d'échappement illisibles dans votre code tout en restant concis à utiliser. Amusez-vous bien !

75 votes

Mettre la couleur comme un nom de fonction et non comme un paramètre est une pratique discutable.

1 votes

@LtWorf : vous pourriez facilement en faire un paramètre en utilisant getattr si vous en avez besoin. Ou, plus vraisemblablement, créez simplement la chaîne de format de manière dynamique à la place.

0 votes

@LtWorf : pourquoi ? Les fonctions et méthodes de Python sont des citoyens de première classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X