Bagaimana saya bisa output teks berwarna ke terminal, di Python? Apa yang terbaik simbol Unicode untuk mewakili blok yang solid?
Ini agak tergantung pada platform apa yang anda berada di. Cara yang paling umum untuk melakukan ini adalah dengan mencetak ANSI escape sequences. Untuk contoh sederhana, di sini's beberapa kode python dari blender membangun script:
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'
Untuk menggunakan kode ini, anda dapat melakukan sesuatu seperti
print bcolors.WARNING + "Warning: No active frommets remain. Continue?"
+ bcolors.ENDC
Ini akan bekerja pada unix termasuk OS X, linux dan windows (yang disediakan anda gunakan ANSICON, atau Windows 10 yang disediakan anda mengaktifkan emulasi VT100). Ada ansi kode untuk pengaturan warna, memindahkan kursor, dan banyak lagi.
Jika anda akan mendapatkan rumit dengan ini (dan itu terdengar seperti anda jika anda menulis sebuah game), anda harus melihat ke dalam "kutukan" modul yang menangani banyak bagian yang rumit dari ini untuk anda. The Python Kutukan HowTO adalah pengenalan yang baik.
Jika anda tidak menggunakan ASCII diperpanjang (yaitu tidak di PC), anda terjebak dengan karakter ascii di bawah 127, dan '#' atau '@' mungkin adalah taruhan terbaik anda untuk memblokir. Jika anda dapat memastikan terminal anda menggunakan IBM extended ascii character set, anda memiliki lebih banyak pilihan. Karakter 176, 177, 178 dan 219 adalah "blok karakter".
Beberapa teks modern berbasis program, seperti "Dwarf Fortress", meniru mode teks dalam mode grafis, dan menggunakan gambar dari PC klasik font. Anda dapat menemukan beberapa bitmap yang dapat anda gunakan pada Dwarf Fortress Wiki lihat (user-dibuat tilesets).
Tombol Mode Teks Kontes Demo memiliki lebih banyak sumber daya untuk melakukan grafis dalam mode teks.
Hmm.. saya pikir ada sedikit terbawa pada jawaban ini. Aku di tengah-tengah merencanakan sebuah epik berbasis teks petualangan permainan, meskipun. Good luck dengan teks berwarna!
I'm terkejut tidak ada yang telah disebutkan Python termcolor modul. Penggunaan cukup sederhana:
from termcolor import colored
print colored('hello', 'red'), colored('world', 'green')
Atau di Python 3:
print(colored('hello', 'red'), colored('world', 'green'))
Hal itu mungkin tidak cukup canggih, namun, untuk game pemrograman dan "blok berwarna" yang ingin anda lakukan...
Mencetak string yang dimulai warna/gaya, maka string, kemudian akhir warna/perubahan gaya dengan '\x1b[0m'
:
print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')
Mendapatkan meja pilihan format untuk shell teks dengan kode berikut:
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()
Mendefinisikan string yang dimulai dari sebuah warna dan sebuah tali yang ujungnya warna, kemudian mencetak teks dengan awal string di depan dan akhir string di akhir.
CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)
Ini menghasilkan berikut di bash
, di urxvt
dengan Zenburn-gaya skema warna:
Melalui eksperimen, kita bisa mendapatkan lebih banyak warna:
Catatan: \33[5m
dan \33[6m
berkedip.
Dengan cara ini kita dapat membuat koleksi penuh warna:
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'
Berikut ini adalah kode untuk menghasilkan tes:
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
Anda ingin belajar tentang ANSI escape sequences. Berikut ini's contoh singkat:
CSI="\x1B["
print(CSI+"31;40m" + "Colored Text" + CSI + "0m")
Untuk info lebih lanjut lihat http://en.wikipedia.org/wiki/ANSI_escape_code
Untuk blok karakter, mencoba karakter unicode seperti \u2588:
print(u"\u2588")
Menempatkan itu semua bersama-sama:
print(CSI+"31;40m" + u"\u2588" + CSI + "0m")
Cara favorit saya adalah dengan Berkah perpustakaan yang lengkap (full disclosure: saya menulis ini). Misalnya:
from blessings import Terminal
t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')
Untuk cetak batu bata berwarna, cara yang paling dapat diandalkan adalah untuk mencetak ruang dengan warna latar belakang. Saya menggunakan teknik ini untuk menarik progress bar di hidung-progressive:
print t.on_green(' ')
Anda dapat mencetak di lokasi tertentu juga:
with t.location(0, 5):
print t.on_yellow(' ')
Jika anda memiliki kotoran dengan terminal lain kemampuan dalam perjalanan dari permainan anda, anda bisa melakukan itu juga. Anda dapat menggunakan Python's standar string format untuk tetap dibaca:
print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)
Hal yang baik tentang berkat-Berkat adalah bahwa itu yang terbaik untuk bekerja pada segala macam terminal, bukan hanya (sangat umum) ANSI-warna yang. Hal ini juga membuat tidak terbaca escape sequences dari kode sementara sisanya ringkas untuk digunakan. Bersenang-senang!
dihasilkan sebuah kelas dengan semua warna menggunakan loop for untuk iterate setiap kombinasi dari warna sampai dengan 100, kemudian menulis sebuah kelas dengan python warna. Copy dan paste seperti yang anda akan, GPLv2 oleh saya:
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'
sty mirip dengan sengaja, tapi itu's kurang verbose, mendukung 8bit dan 24bit (rgb) warna, memungkinkan anda untuk mendaftar warna anda sendiri, adalah benar-benar fleksibel dan didokumentasikan dengan baik.
Contoh:
``python dari sty impor fg, bg, ef, rs
foo = fg.merah + 'Ini adalah teks merah!' + fg.rs bar = bg.biru + 'Ini memiliki latar belakang biru!' + bg.rs baz = ef.italic + 'Ini adalah teks italic' + rs.italic qux = fg(201) + 'Ini adalah merah muda teks menggunakan 8bit warna' + fg.rs qui = fg(255, 10, 10) + 'Ini adalah teks merah menggunakan 24 bit warna.' + fg.rs
dari sty import Style, RgbFg
fg.orange = Gaya(RgbFg(255, 150, 50))
buf = fg.orange + 'Yay, Im orange.' + fg.rs
cetak(foo, bar, baz, qux, qui, buf, sep='\n') ``
cetakan:
Coba ini kode sederhana
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")
Di Windows anda dapat menggunakan modul 'win32console' (tersedia di beberapa Python distro) atau modul 'ctypes' (Python 2.5 dan up) untuk mengakses Win32 API.
Untuk melihat kode lengkap yang mendukung kedua cara, melihat warna konsol pelaporan kode dari Testoob.
ctypes contoh:
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)
I'm merespons karena saya telah menemukan cara untuk menggunakan ANSI kode pada windows sehingga anda dapat mengubah warna teks tanpa ada modul yang tidak't dibangun dalam:
Garis yang membuat pekerjaan ini adalah os.sistem('warna')
, tapi untuk memastikan anda don't meningkatkan kesalahan jika orang ini tidak ada di Windows anda bisa menggunakan script ini:
``python
impor os, sys
jika sys.platform.lebih rendah() == "win32": os.sistem('warna')
kelas gaya(): HITAM = lambda x: '\033[30 m' + str(x) MERAH = lambda x: '\033[31 m' + str(x) HIJAU = lambda x: '\033[32m' + str(x) KUNING = lambda x: '\033[33m' + str(x) BIRU = lambda x: '\033[34 m' + str(x) MAGENTA = lambda x: '\033[35m' + str(x) CYAN = lambda x: '\033[36m' + str(x) PUTIH = lambda x: '\033[37m' + str(x) MENGGARISBAWAHI = lambda x: '\033[4m' + str(x) RESET = lambda x: '\033[0m' + str(x)
cetak(gaya.KUNING("Hello, ") + gaya.RESET("Dunia!")) ``
Python Versi: 3.6.7 (32 bit)
Bodoh sederhana berdasarkan @joeld's jawaban
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)
Kemudian hanya
PrintInColor.red('hello', end=' ')
PrintInColor.green('world')
Saya telah dibungkus @joeld jawaban dalam modul dengan fungsi-fungsi global yang dapat saya gunakan di mana saja dalam kode saya.
file: log.py
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
penggunaan sebagai berikut:
import log
log.info("Hello World")
log.err("System Error")
Untuk Windows anda tidak dapat mencetak ke console dengan warna kecuali anda're menggunakan win32api.
Untuk Linux itu's sederhana seperti menggunakan cetak, dengan escape sequences yang diuraikan berikut ini:
Untuk karakter untuk mencetak seperti kotak, itu benar-benar tergantung pada apa jenis huruf yang anda gunakan untuk jendela konsol. Simbol pon bekerja dengan baik, tapi itu tergantung pada jenis huruf:
#
Akhirnya aku melakukan ini, aku merasa itu adalah terbersih:
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)
Bangunan di @joeld menjawab, menggunakan https://pypi.python.org/pypi/lazyme pip install-U lazyme
:
from lazyme.string import color_print
>>> color_print('abc')
abc
>>> color_print('abc', color='pink')
abc
>>> color_print('abc', color='red')
abc
>>> color_print('abc', color='yellow')
abc
>>> color_print('abc', color='green')
abc
>>> color_print('abc', color='blue', underline=True)
abc
>>> color_print('abc', color='blue', underline=True, bold=True)
abc
>>> color_print('abc', color='pink', underline=True, bold=True)
abc
Screenshot:
Beberapa update untuk color_print
dengan baru formatters, misalnya:
>>> from lazyme.string import palette, highlighter, formatter
>>> from lazyme.string import color_print
>>> palette.keys() # Available colors.
['pink', 'yellow', 'cyan', 'magenta', 'blue', 'gray', 'default', 'black', 'green', 'white', 'red']
>>> highlighter.keys() # Available highlights.
['blue', 'pink', 'gray', 'black', 'yellow', 'cyan', 'green', 'magenta', 'white', 'red']
>>> formatter.keys() # Available formatter,
['hide', 'bold', 'italic', 'default', 'fast_blinking', 'faint', 'strikethrough', 'underline', 'blinking', 'reverse']
Catatan: italic
, berkedip cepat
dan coret
mungkin tidak bekerja pada semua terminal, doesn't bekerja pada Mac / Ubuntu.
E. g.
>>> color_print('foo bar', color='pink', highlight='white')
foo bar
>>> color_print('foo bar', color='pink', highlight='white', reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', bold=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True, reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', underline=True, reverse=True)
foo bar
Screenshot:
perhatikan seberapa baik dengan
kata kunci bercampur dengan pengubah seperti ini yang perlu diatur ulang (menggunakan Python 3 dan 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")
Anda bisa menggunakan CLINT:
from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')
Anda dapat menggunakan Python pelaksanaan kutukan perpustakaan: http://docs.python.org/library/curses.html
Juga, menjalankan dan anda'll menemukan kotak:
for i in range(255):
print i, chr(i)