Hoe kan ik gekleurde tekst naar de terminal afdrukken?

Hoe kan ik gekleurde tekst naar de terminal in Python uitvoeren?


Antwoord 1, autoriteit 100%

Dit hangt enigszins af van op welk platform u zich bevindt. De meest gebruikelijke manier om dit te doen is door ANSI-escape-reeksen af te drukken. Voor een eenvoudig voorbeeld is hier wat Python-code van de Blender build-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'

Als je code op deze manier wilt gebruiken, kun je zoiets doen als:

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

Of, met Python 3.6+:

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

Dit werkt op unixen, waaronder OS X, Linux en Windows (op voorwaarde dat u ANSICONgebruikt, of in Windows 10 op voorwaarde dat u VT100-emulatieinschakelt). Er zijn ANSI-codes voor het instellen van de kleur, het verplaatsen van de cursor en meer.

Als u hiermee ingewikkeld zult worden (en het klinkt alsof u bent als u een game schrijft), moet u kijken naar de “Curses ” Module, die veel van de gecompliceerde delen hiervoor behandelt. The python vloekt HOWTO is een goede introductie.

Als u geen extended ASCII gebruikt (d.w.z. niet op een pc), zit u vast met de ASCII-tekens onder 127, en ‘#’ of ‘@’ is waarschijnlijk je beste gok voor een blok. Als u ervoor kunt zorgen dat uw terminal een IBM uitgebreid ASCII-tekenset heeft, heb je nog veel meer opties. Tekens 176, 177, 178 en 219 zijn de “Blokkers”.

Enkele moderne op tekst gebaseerde programma’s, zoals “Dwarf Fortress”, emuleer de tekstmodus in een grafische modus en gebruiken afbeeldingen van het klassieke pc-lettertype. U kunt een aantal van deze bitmaps vinden die u kunt gebruiken op de dwerg fort wiki zie (Gebruikersgemaakte tilesets ).

De Tekstmodus Demo-wedstrijd heeft meer middelen om te doen Graphics in de tekstmodus.


2, Autoriteit 43%

Er is ook de Python TermColor Module . Gebruik is vrij eenvoudig:

from termcolor import colored
print colored('hello', 'red'), colored('world', 'green')

of in Python 3:

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

Het is misschien niet geavanceerd genoeg, echter voor game-programmering en de “gekleurde blokken” die u wilt doen …


3, Autoriteit 38%

Het antwoord is colorama voor alle platformlife kleuring in Python.

Het ondersteunt Python 3.5+ evenals Python 2.7.

en vanaf januari 2021 wordt het gehandhaafd.

Voorbeeld schermafbeelding:


4, Autoriteit 23%

Druk een reeks af die een kleur / stijl start, vervolgens de tekenreeks en eindig de kleur / stijl wijziging met '\x1b[0m':

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

Krijg een tabel met formatteeropties 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()

licht-on-dark voorbeeld (voltooid)

Dark-on-light voorbeeld (gedeeltelijk)


Antwoord 5, autoriteit 11%

Definieer een tekenreeks waarmee een kleur begint en een tekenreeks die de kleur beëindigt. Druk vervolgens uw tekst af met de begintekenreeks vooraan en de eindreeks aan het einde.

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

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

Door te experimenteren kunnen we meer kleuren krijgen:

Opmerking: \33[5men \33[6mknipperen.

Op deze manier kunnen we een full colour collectie creëren:

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

Antwoord 6, autoriteit 6%

Hier is een oplossing die native op Windows 10 werkt.

Door een systeemaanroep te gebruiken, zoals os.system(""), kunnen kleuren native worden afgedrukt in de opdrachtprompt en Powershell:

import os
# System call
os.system("")
# Class of different styles
class style():
    BLACK = '\033[30m'
    RED = '\033[31m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'
    MAGENTA = '\033[35m'
    CYAN = '\033[36m'
    WHITE = '\033[37m'
    UNDERLINE = '\033[4m'
    RESET = '\033[0m'
print(style.YELLOW + "Hello, World!")

Opmerking: Windows ondersteunt ANSI-codes niet volledig, hetzij via systeemaanroepen of modules. Niet alle tekstdecoratie wordt ondersteund, en hoewel de heldere kleuren worden weergegeven, zijn ze identiek aan de reguliere kleuren.

Met dank aan @j-l voor het vinden van een nog kortere methode.

tl;dr: os.system("")

toevoegen


Antwoord 7, autoriteit 5%

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

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

Zie ANSI Escape Code .

Probeer een unicode-teken als \ u2588:

print(u"\u2588")

alles bij elkaar plaatsen:

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

8, Autoriteit 4%

stal is vergelijkbaar met Colorama, maar het is minder uitgebreid, ondersteunt 8-bit en 24-bit (RGB) Kleuren, ondersteunt alle Effecten (vet, onderstrepen, etc.) Hiermee kunt u Registreer uw eigen stijlen , is volledig getypt, ondersteunt muting , is echt flexibel, goed gedocumenteerd en meer …

voorbeelden:

from sty import fg, bg, ef, rs
foo = fg.red + 'This is red text!' + fg.rs
bar = bg.blue + 'This has a blue background!' + bg.rs
baz = ef.italic + 'This is italic text' + rs.italic
qux = fg(201) + 'This is pink text using 8bit colors' + fg.rs
qui = fg(255, 10, 10) + 'This is red text using 24bit colors.' + fg.rs
# Add custom colors:
from sty import Style, RgbFg
fg.orange = Style(RgbFg(255, 150, 50))
buf = fg.orange + 'Yay, Im orange.' + fg.rs
print(foo, bar, baz, qux, qui, buf, sep='\n')

afdrukken:

Demo:


Antwoord 9, autoriteit 3%

Mijn favoriete manier is met de Blessings-bibliotheek (volledige openbaarmaking: ik heb het geschreven). Bijvoorbeeld:

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

Als u gekleurde stenen wilt afdrukken, is de meest betrouwbare manier om spaties met achtergrondkleuren af te drukken. Ik gebruik deze techniek om de voortgangsbalk te tekenen in nose-progressive:

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 met andere terminalmogelijkheden moet rotzooien, kun je dat ook doen. Je kunt de standaard tekenreeksopmaak 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 soorten terminals te werken, niet alleen op de (overweldigende) ANSI-kleuren. Het houdt ook onleesbare escape-reeksen uit uw code terwijl het beknopt blijft om te gebruiken. Veel plezier!


Antwoord 10, autoriteit 3%

Richis een relatief nieuwe Python-bibliotheek voor het werken met kleur in de terminal.

Er zijn een paar manieren om met kleur te werken in Rich. De snelste manier om te beginnen is de rich print-methode die een BBCode-achtige syntaxis in ANSI-controlecodes:

from rich import print
print("[red]Color[/] in the [bold magenta]Terminal[/]!")

Er zijn andere manieren om kleur toe te passen met Rich (regex, syntaxis) en gerelateerde opmaakfuncties.


Antwoord 11, autoriteit 3%

Ik heb een klasse gegenereerd met alle kleuren met behulp van een for-lus om elke combinatie van kleuren tot 100 te herhalen, en schreef vervolgens een klasse met Python-kleuren. Kopieer en plak zoals je wilt, GPLv2 door mij:

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'

Antwoord 12, autoriteit 2%

Probeer deze eenvoudige code

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!")

Antwoord 13, autoriteit 2%

Ik heb een bibliotheek genaamd colorit. Het is supereenvoudig.

Hier zijn enkele voorbeelden:

from colorit import *
# Use this to ensure that ColorIt will be usable by certain command line interfaces
# Note: This clears the terminal
init_colorit()
# Foreground
print(color("This text is red", Colors.red))
print(color("This text is orange", Colors.orange))
print(color("This text is yellow", Colors.yellow))
print(color("This text is green", Colors.green))
print(color("This text is blue", Colors.blue))
print(color("This text is purple", Colors.purple))
print(color("This text is white", Colors.white))
# Background
print(background("This text has a background that is red", Colors.red))
print(background("This text has a background that is orange", Colors.orange))
print(background("This text has a background that is yellow", Colors.yellow))
print(background("This text has a background that is green", Colors.green))
print(background("This text has a background that is blue", Colors.blue))
print(background("This text has a background that is purple", Colors.purple))
print(background("This text has a background that is white", Colors.white))
# Custom
print(color("This color has a custom grey text color", (150, 150, 150)))
print(background("This color has a custom grey background", (150, 150, 150)))
# Combination
print(
    background(
        color("This text is blue with a white background", Colors.blue), Colors.white
    )
)
# If you are using Windows Command Line, this is so that it doesn't close immediately
input()

Dit geeft u:

Het is ook vermeldenswaard dat dit een cross-platform is en is getest op Mac, Linux en Windows.

Mogelijk wilt u het uitproberen: https://github.com/supermazingcoder/colorit

coloritis nu beschikbaar voor installatie met PyPi! Je kunt het installeren met pip install color-itop Windows en pip3 install color-itop macOS en Linux.


Antwoord 14, autoriteit 2%

Op Windows kunt u module ‘win32console’ (beschikbaar in sommige Python-distributies) of module ‘ctypes’ (Python 2.5 en hoger) gebruiken om toegang te krijgen tot de Win32 API.

Als u de volledige code wilt zien die beide manieren ondersteunt, raadpleegt u de rapportagecode voor kleurenconsolevan Testoob.

ctypes voorbeeld:

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)

Antwoord 15, autoriteit 2%

# Pure Python 3.x demo, 256 colors
# Works with bash under Linux and MacOS
fg = lambda text, color: "\33[38;5;" + str(color) + "m" + text + "\33[0m"
bg = lambda text, color: "\33[48;5;" + str(color) + "m" + text + "\33[0m"
def print_six(row, format, end="\n"):
    for col in range(6):
        color = row*6 + col - 2
        if color>=0:
            text = "{:3d}".format(color)
            print (format(text,color), end=" ")
        else:
            print(end="    ")   # four spaces
    print(end=end)
for row in range(0, 43):
    print_six(row, fg, " ")
    print_six(row, bg)
# Simple usage: print(fg("text", 160))


Probeer het online


Antwoord 16, autoriteit 2%

Ik heb joelds antwoordverpakt in een module met globale functies die ik overal in mijn code kan gebruiken.

Bestand: log.py

def enable():
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = "\033[1m"
def disable():
    HEADER = ''
    OKBLUE = ''
    OKGREEN = ''
    WARNING = ''
    FAIL = ''
    ENDC = ''
def infog(msg):
    print(OKGREEN + msg + ENDC)
def info(msg):
    print(OKBLUE + msg + ENDC)
def warn(msg):
    print(WARNING + msg + ENDC)
def err(msg):
    print(FAIL + msg + ENDC)
enable()

Als volgt gebruiken:

import log
log.info("Hello, World!")
log.err("System Error")

Antwoord 17

def black(text):
    print('\033[30m', text, '\033[0m', sep='')
def red(text):
    print('\033[31m', text, '\033[0m', sep='')
def green(text):
    print('\033[32m', text, '\033[0m', sep='')
def yellow(text):
    print('\033[33m', text, '\033[0m', sep='')
def blue(text):
    print('\033[34m', text, '\033[0m', sep='')
def magenta(text):
    print('\033[35m', text, '\033[0m', sep='')
def cyan(text):
    print('\033[36m', text, '\033[0m', sep='')
def gray(text):
    print('\033[90m', text, '\033[0m', sep='')
black("BLACK")
red("RED")
green("GREEN")
yellow("YELLOW")
blue("BLACK")
magenta("MAGENTA")
cyan("CYAN")
gray("GRAY")

Online proberen


Antwoord 18

Voor Windows kunt u niet met kleuren naar console afdrukken, tenzij u de Win32API gebruikt .

Voor Linux is het net zo eenvoudig als het gebruik van print, met de escape-reeksen die hier worden beschreven:

Kleuren

Voordat het teken als een doos wordt afgedrukt, hangt het er echt van af welk lettertype je gebruikt voor het consolevenster. Het hekje werkt goed, maar het hangt af van het lettertype:

#

Antwoord 19

Stom eenvoudig, gebaseerd op joelds antwoord:

class PrintInColor:
    RED = '\033[91m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    LIGHT_PURPLE = '\033[94m'
    PURPLE = '\033[95m'
    END = '\033[0m'
    @classmethod
    def red(cls, s, **kwargs):
        print(cls.RED + s + cls.END, **kwargs)
    @classmethod
    def green(cls, s, **kwargs):
        print(cls.GREEN + s + cls.END, **kwargs)
    @classmethod
    def yellow(cls, s, **kwargs):
        print(cls.YELLOW + s + cls.END, **kwargs)
    @classmethod
    def lightPurple(cls, s, **kwargs):
        print(cls.LIGHT_PURPLE + s + cls.END, **kwargs)
    @classmethod
    def purple(cls, s, **kwargs):
        print(cls.PURPLE + s + cls.END, **kwargs)

Dan gewoon

PrintInColor.red('hello', end=' ')
PrintInColor.green('world')

Antwoord 20

Ik heb dit uiteindelijk gedaan en ik vond het het schoonst:

formatters = {
    'RED': '\033[91m',
    'GREEN': '\033[92m',
    'END': '\033[0m',
}
print 'Master is currently {RED}red{END}!'.format(**formatters)
print 'Help make master {GREEN}green{END} again!'.format(**formatters)

Antwoord 21

Merk op hoe goed het trefwoord withzich vermengt met modifiers zoals deze die moeten worden gereset (met Python 3 en Colorama):

from colorama import Fore, Style
import sys
class Highlight:
  def __init__(self, clazz, color):
    self.color = color
    self.clazz = clazz
  def __enter__(self):
    print(self.color, end="")
  def __exit__(self, type, value, traceback):
    if self.clazz == Fore:
      print(Fore.RESET, end="")
    else:
      assert self.clazz == Style
      print(Style.RESET_ALL, end="")
    sys.stdout.flush()
with Highlight(Fore, Fore.GREEN):
  print("this is highlighted")
print("this is not")

Antwoord 22

Je zou Clint:

kunnen gebruiken

from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')

Antwoord 23

Je kunt de Python-implementatie van de bibliotheek cursesgebruiken:
vloeken — Terminalverwerking voor karakterceldisplays

Voer dit ook uit en je zult je box vinden:

for i in range(255):
    print i, chr(i)

24

Dit is naar mijn mening de gemakkelijkste methode. Zolang u de RGB-waarden van de gewenste kleur heeft, zou dit moeten werken:

def colored(r, g, b, text):
    return "\033[38;2;{};{};{}m{} \033[38;2;255;255;255m".format(r, g, b, text)

Een voorbeeld van het afdrukken van rode tekst:

text = 'Hello, World!'
colored_text = colored(255, 0, 0, text)
print(colored_text)
#or
print(colored(255, 0, 0, 'Hello, World!'))

Multi-gekleurde tekst

text = colored(255, 0, 0, 'Hello, ') + colored(0, 255, 0, 'World')
print(text)

25

Als u een spel programmeert, wilt u de achtergrondkleur wijzigen en alleen spaties gebruiken? Bijvoorbeeld:

print " "+ "\033[01;41m" + " " +"\033[01;46m"  + "  " + "\033[01;42m"

26

Een eenvoudiger optie zou zijn om de cprint-functie uit de termcolorPackage te gebruiken.

Het ondersteunt ook %s, %dFORMATION VAN HET DRINKEN:


27

Als u Windows gebruikt, gaat u hier!

# Display text on a Windows console
# Windows XP with Python 2.7 or Python 3.2
from ctypes import windll
# Needed for Python2/Python3 diff
try:
    input = raw_input
except:
    pass
STD_OUTPUT_HANDLE = -11
stdout_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
# Look at the output and select the color you want.
# For instance, hex E is yellow on black.
# Hex 1E is yellow on blue.
# Hex 2E is yellow on green and so on.
for color in range(0, 75):
     windll.kernel32.SetConsoleTextAttribute(stdout_handle, color)
     print("%X --> %s" % (color, "Have a fine day!"))
     input("Press Enter to go on ... ")

Antwoord 28

JAAAA! Een andere versie

Hoewel ik dit antwoordnuttig vind, heb ik het een beetje aangepast. Deze GitHub Gistis het resultaat

Gebruik

print colors.draw("i'm yellow", bold=True, fg_yellow=True)

Bovendien kunt u veelvoorkomend gebruik inpakken:

print colors.error('sorry, ')

https://gist.github.com/Jossef/0ee20314577925b4027f


Antwoord 29

Als je Djangogebruikt:

>>> from django.utils.termcolors import colorize
>>> print colorize("Hello, World!", fg="blue", bg='red',
...                 opts=('bold', 'blink', 'underscore',))
Hello World!
>>> help(colorize)

Momentopname:

(Ik gebruik over het algemeen gekleurde uitvoer voor foutopsporing op runserver-terminal, dus ik heb het toegevoegd.)

U kunt testen of het op uw computer is geïnstalleerd:
$ python -c "import django; print django.VERSION". Om het te installeren, controleer: Hoe Django te installeren

Probeer het eens probeer!!

Other episodes