Pregunta Imprimir en la terminal con colores?


¿Cómo puedo enviar texto en color a la terminal, en Python? ¿Cuál es el mejor símbolo Unicode para representar un bloque sólido?


1515
2017-11-13 18:58


origen


Respuestas:


Esto depende de la plataforma en la que se encuentre. La forma más común de hacerlo es imprimiendo secuencias de escape ANSI. Para un ejemplo simple, aquí hay un código de Python del Guiones de compilación de mezcla:

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'

Para usar un código como este, puedes hacer algo como

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

Esto funcionará en Unixes incluyendo OS X, Linux y Windows (siempre que use ANSICON, o en Windows 10 siempre que lo habilites Emulación VT100) Hay códigos ansi para configurar el color, mover el cursor y más.

Si te vas a complicar con esto (y suena como si estuvieras escribiendo un juego), deberías mirar el módulo "maldiciones", que maneja muchas de las partes complicadas de esto para ti. los Python maldice cómo es una buena introducción.

Si no está utilizando ASCII extendido (es decir, no en una PC), está atrapado con los caracteres ascii por debajo de 127, y '#' o '@' es probablemente la mejor opción para un bloque. Si puede asegurarse de que su terminal está utilizando una IBM juego de caracteres ascii extendido, tienes muchas más opciones. Los caracteres 176, 177, 178 y 219 son los "caracteres de bloque".

Algunos programas modernos basados ​​en texto, como "Fortaleza enana", emulan el modo de texto en un modo gráfico y usan imágenes de la fuente de PC clásica. Puede encontrar algunos de estos mapas de bits que puede usar en Dwarf Fortress Wiki ver (tilesets hechos por el usuario)

los Concurso de demostración de modo de texto tiene más recursos para hacer gráficos en modo texto.

Hmm ... Creo que me dejé llevar por la respuesta. Sin embargo, estoy planeando un juego de aventuras épico basado en texto. ¡Buena suerte con tu texto de color!


1340
2017-11-13 19:25



Me sorprende que nadie haya mencionado el Módulo de color de Python. El uso es bastante simple:

from termcolor import colored

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

Sin embargo, puede no ser lo suficientemente sofisticado para la programación del juego y los "bloques de colores" que desea hacer ...


553
2017-11-16 07:31



La respuesta es Colorama para todos los colores multiplataforma en Python.

Una captura de pantalla de ejemplo de Python 3.6: example screenshot


477
2017-07-26 07:07



Imprima una cadena que comience un color / estilo, luego la cadena, luego finalice el cambio de color / estilo con '\x1b[0m':

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

Success with green background example

Obtenga una tabla de opciones de formato para texto de shell con el siguiente código:

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

Ejemplo de luz sobre oscuridad (completo)

enter image description here

Ejemplo de oscuridad sobre la luz (parcial)

top part of output


280
2018-02-14 17:56



Desea conocer las secuencias de escape de ANSI. Aquí hay un breve ejemplo:

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

Para más información, ver http://en.wikipedia.org/wiki/ANSI_escape_code

Para un personaje de bloque, pruebe un carácter Unicode como \ u2588:

print u"\u2588"

Poniendolo todo junto:

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

71
2017-11-13 19:22



Defina una cadena que comience con un color y una cadena que finalice con el color, luego imprima su texto con la cadena de inicio al final y la cadena final al final.

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

Esto produce lo siguiente en bash, en urxvtcon un esquema de color estilo Zenburn:

output colors

Mediante experemintation, podemos obtener más colores:

color matrix

Nota: \33[5m y \33[6m están parpadeando.

De esta forma podemos crear una colección a todo color:

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'

Aquí está el código para generar la prueba:

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



Mi forma favorita es con el Bendiciones biblioteca (divulgación completa: lo escribí). Por ejemplo:

from blessings import Terminal

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

Para imprimir ladrillos de colores, la manera más confiable es imprimir espacios con colores de fondo. Utilizo esta técnica para dibujar la barra de progreso en nariz progresiva:

print t.on_green(' ')

También puede imprimir en ubicaciones específicas:

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

Si tienes que lidiar con otras capacidades de la terminal en el transcurso de tu juego, puedes hacerlo también. Puede usar el formato de cadena estándar de Python para mantenerlo legible:

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

Lo bueno de Blessings es que hace todo lo posible para trabajar en todo tipo de terminales, no solo en los (abrumadoramente comunes) colores ANSI. También mantiene las secuencias de escape ilegibles fuera de su código sin dejar de ser conciso de usar. ¡Que te diviertas!


59
2017-12-18 00:32



generó una clase con todos los colores usando un bucle for para iterar cada combinación de color hasta 100, luego escribió una clase con colores de pitón. Copie y pegue como quiera, GPLv2 por mi:

class colors:
    '''Colors class:
    reset all colors with colors.reset
    two subclasses fg for foreground and bg for background.
    use as colors.subclass.colorname.
    i.e. colors.fg.red or colors.bg.green
    also, the generic bold, disable, underline, reverse, strikethrough,
    and invisible work with the main class
    i.e. colors.bold
    '''
    reset='\033[0m'
    bold='\033[01m'
    disable='\033[02m'
    underline='\033[04m'
    reverse='\033[07m'
    strikethrough='\033[09m'
    invisible='\033[08m'
    class fg:
        black='\033[30m'
        red='\033[31m'
        green='\033[32m'
        orange='\033[33m'
        blue='\033[34m'
        purple='\033[35m'
        cyan='\033[36m'
        lightgrey='\033[37m'
        darkgrey='\033[90m'
        lightred='\033[91m'
        lightgreen='\033[92m'
        yellow='\033[93m'
        lightblue='\033[94m'
        pink='\033[95m'
        lightcyan='\033[96m'
    class bg:
        black='\033[40m'
        red='\033[41m'
        green='\033[42m'
        orange='\033[43m'
        blue='\033[44m'
        purple='\033[45m'
        cyan='\033[46m'
        lightgrey='\033[47m'

41
2017-10-18 23:26



Prueba este código simple

def prRed(prt): print("\033[91m {}\033[00m" .format(prt))
def prGreen(prt): print("\033[92m {}\033[00m" .format(prt))
def prYellow(prt): print("\033[93m {}\033[00m" .format(prt))
def prLightPurple(prt): print("\033[94m {}\033[00m" .format(prt))
def prPurple(prt): print("\033[95m {}\033[00m" .format(prt))
def prCyan(prt): print("\033[96m {}\033[00m" .format(prt))
def prLightGray(prt): print("\033[97m {}\033[00m" .format(prt))
def prBlack(prt): print("\033[98m {}\033[00m" .format(prt))

prGreen("Hello world")

34
2017-12-23 20:20



En Windows puede usar el módulo 'win32console' (disponible en algunas distribuciones de Python) o el módulo 'ctypes' (Python 2.5 y superior) para acceder a la API de Win32.

Para ver el código completo que admite ambas formas, vea el código de informe de la consola de color de Testoob.

Ejemplo de ctypes:

import ctypes

# Constants from the Windows API
STD_OUTPUT_HANDLE = -11
FOREGROUND_RED    = 0x0004 # text color contains red.

def get_csbi_attributes(handle):
    # Based on IPython's winconsole.py, written by Alexander Belchenko
    import struct
    csbi = ctypes.create_string_buffer(22)
    res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
    assert res

    (bufx, bufy, curx, cury, wattr,
    left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
    return wattr


handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
reset = get_csbi_attributes(handle)

ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_RED)
print "Cherry on top"
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset)

24
2017-11-13 22:22