Vraag Print in terminal met kleuren?


Hoe kan ik gekleurde tekst naar de terminal sturen, in Python? Wat is het beste Unicode-symbool om een ​​solide blok te vertegenwoordigen?


1515
2017-11-13 18:58


oorsprong


antwoorden:


Dit is enigszins afhankelijk van het platform waarop u zich bevindt. De meest gebruikelijke manier om dit te doen, is door ANSI-escape-reeksen af ​​te drukken. Voor een eenvoudig voorbeeld, hier is een aantal python code van de blender build scripts:

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'

Om zo'n code te gebruiken, kunt u zoiets doen

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

Dit werkt op Unixes inclusief OS X, Linux en Windows (mits je gebruikt ANSICONof in Windows 10 op voorwaarde dat u deze hebt ingeschakeld VT100-emulatie). Er zijn ansi-codes voor het instellen van de kleur, het verplaatsen van de cursor en meer.

Als je hier gecompliceerd mee wilt worden (en het klinkt alsof je bent als je een spel aan het schrijven bent), zou je de "vloeken" -module moeten bekijken, die veel van de gecompliceerde onderdelen hiervan voor je afhandelt. De Python Curses HowTO is een goede introductie.

Als je geen uitgebreide ASCII gebruikt (dus niet op een pc), zit je vast met de ascii-tekens onder de 127 en is '#' of '@' waarschijnlijk de beste gok voor een blok. Als u ervoor kunt zorgen dat uw terminal een IBM gebruikt uitgebreide ASCII-tekenset, je hebt veel meer opties. Personages 176, 177, 178 en 219 zijn de "blokletters".

Sommige moderne tekstgebaseerde programma's, zoals "Dwarf Fortress", emuleren de tekstmodus in een grafische modus en gebruiken afbeeldingen van het klassieke pc-lettertype. Je kunt enkele van deze bitmaps vinden die je kunt gebruiken op de Dwarf Fortress Wiki zien (door de gebruiker gemaakte tilesets).

De Tekstmodus demo-wedstrijd heeft meer middelen voor het uitvoeren van afbeeldingen in de tekstmodus.

Hmm .. Ik denk dat dit antwoord een beetje meegaat. Ik ben echter bezig met het plannen van een episch op tekst gebaseerd avonturenspel. Veel succes met je gekleurde tekst!


1340
2017-11-13 19:25



Ik ben verrast dat niemand het heeft genoemd Python termcolor-module. Gebruik is vrij eenvoudig:

from termcolor import colored

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

Het is echter mogelijk niet verfijnd genoeg voor het programmeren van spellen en de "gekleurde blokken" die je wilt doen ...


553
2017-11-16 07:31



Het antwoord is Colorama voor alle platformonafhankelijke kleuren in Python.

Voorbeeldscherm van een Python 3.6-voorbeeld: example screenshot


477
2017-07-26 07:07



Druk een tekenreeks af die een kleur / stijl begint, vervolgens de tekenreeks, en beëindig de wijziging in kleur / stijl met '\x1b[0m':

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

Success with green background example

Krijg een tabel met indelingsopties voor shell-tekst met de volgende code:

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()

Light-on-dark voorbeeld (compleet)

enter image description here

Dark-on-light voorbeeld (gedeeltelijk)

top part of output


280
2018-02-14 17:56



U wilt meer weten over ANSI-escape-sequences. Hier is een kort voorbeeld:

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

Zie voor meer info http://en.wikipedia.org/wiki/ANSI_escape_code

Probeer voor een blokteken een unicode-teken zoals \ u2588:

print u"\u2588"

Alles bij elkaar:

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

71
2017-11-13 19:22



Definieer een tekenreeks die een kleur en een tekenreeks start die de kleur beëindigt, en druk vervolgens uw tekst af met de begintekst aan de voorkant en de eindstring aan het einde.

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

Dit levert het volgende op bash, in urxvtmet een Zenburn-stijl kleurenschema:

output colors

Door middel van experimenten kunnen we meer kleuren krijgen:

color matrix

Notitie: \33[5m en \33[6m knipperen.

Op deze manier kunnen we een volledige kleurenverzameling maken:

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'

Hier is de code om de test te genereren:

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



Mijn favoriete manier is met de zegeningen bibliotheek (volledige openbaarmaking: ik schreef het). Bijvoorbeeld:

from blessings import Terminal

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

Om gekleurde stenen af ​​te drukken, is de meest betrouwbare manier om spaties af te drukken met achtergrondkleuren. Ik gebruik deze techniek om de voortgangsbalk in te tekenen neus-progressieve:

print t.on_green(' ')

U kunt ook op specifieke locaties afdrukken:

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

Als je in de loop van je spel andere terminal-functies moet missen, kun je dat ook doen. U kunt de standaard stringopmaak van Python gebruiken om het leesbaar te houden:

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

Het leuke van Blessings is dat het zijn best doet om op allerlei terminals te werken, niet alleen de (overwegend gewone) ANSI-kleuren. Het houdt ook onleesbare ontsnappingssequenties uit je code terwijl het toch beknopt is om te gebruiken. Veel plezier!


59
2017-12-18 00:32