Làm thế nào để in văn bản màu trong thiết bị đầu cuối trong Python?


2128

Làm cách nào tôi có thể xuất văn bản màu sang thiết bị đầu cuối, bằng Python? Biểu tượng Unicode tốt nhất để thể hiện một khối rắn là gì?


6
Bạn nên chỉ định một số thông tin bổ sung để nhận được phản hồi tốt hơn: đa nền tảng? các mô-đun bên ngoài được chấp nhận?
sorin

2
IPython làm điều đó, đa nền tảng. Xem những gì họ sử dụng?
endolith

Biểu tượng này sẽ tạo ra một khối màu tuyệt vời: Chỉ có vấn đề là nó được mở rộng ASCII, có lẽ bạn có thể làm cho nó hoạt động bằng cách sử dụnghttp://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
Samy Bencherif

Một số thiết bị đầu cuối cũng có thể hiển thị các ký tự Unicode. Nếu điều đó đúng với thiết bị đầu cuối của bạn, các ký tự có thể gần như không giới hạn.
ayke

4
Câu trả lời này đến khá muộn, nhưng có vẻ như là tốt nhất đối với tôi ... những người bình chọn trên nó đòi hỏi hacks đặc biệt cho Windows trong khi cái này chỉ hoạt động: stackoverflow.com/a/3332860/901641
ArtOfWarfare

Câu trả lời:


1834

Điều này phần nào phụ thuộc vào nền tảng của bạn. Cách phổ biến nhất để làm điều này là bằng cách in các chuỗi thoát ANSI. Ví dụ đơn giản, đây là một số mã python từ tập lệnh xây dựng máy xay sinh tố :

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'

Để sử dụng mã như thế này, bạn có thể làm một cái gì đó như

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

hoặc, với Python3.6 +:

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

Điều này sẽ hoạt động trên các unix bao gồm OS X, linux và windows (miễn là bạn sử dụng ANSICON hoặc trong Windows 10 miễn là bạn kích hoạt mô phỏng VT100 ). Có mã ansi để cài đặt màu, di chuyển con trỏ và hơn thế nữa.

Nếu bạn sẽ gặp rắc rối với điều này (và có vẻ như bạn đang viết một trò chơi), bạn nên xem xét mô-đun "lời nguyền", xử lý rất nhiều phần phức tạp của việc này cho bạn. Các Python Curses HOWTO là một giới thiệu tốt.

Nếu bạn không sử dụng ASCII mở rộng (tức là không phải trên PC), bạn sẽ bị kẹt với các ký tự ascii dưới 127 và '#' hoặc '@' có lẽ là lựa chọn tốt nhất cho một khối. Nếu bạn có thể đảm bảo thiết bị đầu cuối của mình đang sử dụng bộ ký tự ascii mở rộng của IBM , bạn có nhiều tùy chọn khác. Các ký tự 176, 177, 178 và 219 là "ký tự khối".

Một số chương trình dựa trên văn bản hiện đại, như "Pháo đài lùn", mô phỏng chế độ văn bản ở chế độ đồ họa và sử dụng hình ảnh của phông chữ PC cổ điển. Bạn có thể tìm thấy một số bitmap này mà bạn có thể sử dụng trên Dwarf Fortress Wiki xem (các ô do người dùng tạo ).

Các chữ Chế độ Demo cuộc thi có thêm nguồn lực để thực hiện đồ họa trong chế độ văn bản.

Hmm .. tôi nghĩ rằng có một chút mang đi về câu trả lời này. Mặc dù vậy, tôi đang lên kế hoạch cho một trò chơi phiêu lưu dựa trên văn bản sử thi. Chúc may mắn với văn bản màu của bạn!


Nhưng giả sử lời nhắc mặc định của tôi không phải là màu đen - Bạn có nghĩ rằng có thể tạo ra python resotre sau những thủ thuật này không?
Adobe

4
Trên Linux, bạn có thể muốn sử dụng tput, như vậy vì nó dẫn đến mã di động nhiều hơn.
Martin Uting

3
@Cawas: Trường hợp sử dụng thực sự disablelà khi bạn chuyển đầu ra thành một tệp; trong khi các công cụ như catcó thể hỗ trợ màu sắc, nói chung tốt hơn là không in thông tin màu vào tệp.
Sebastian Mach

1
@AlexanderSimko, đây là đoạn mã ctypes để kích hoạt hỗ trợ VT100 trong Windows 10 : import ctypes; kernel32 = ctypes.WinDLL('kernel32'); hStdOut = kernel32.GetStdHandle(-11); mode = ctypes.c_ulong(); kernel32.GetConsoleMode(hStdOut, ctypes.byref(mode)); mode.value |= 4; kernel32.SetConsoleMode(hStdOut, mode).
Eryk CN

1
Đối với bất kỳ ai sử dụng mã ví dụ Python từ câu trả lời: Cần lưu ý rằng các màu trong phạm vi 90-97 và 100-107 là không chuẩn và thực tế, trên thiết bị đầu cuối của tôi, tất cả đều không cho màu sắc được chỉ định bởi tên biến. Tốt hơn là sử dụng các phạm vi tiêu chuẩn 30-37 và 40-47. Nguồn: en.wikipedia.org/wiki/ Từ
balu

807

Tôi ngạc nhiên không ai nhắc đến mô-đun termcolor của Python . Cách sử dụng khá đơn giản:

from termcolor import colored

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

Hoặc trong Python 3:

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

Tuy nhiên, nó có thể không đủ tinh vi để lập trình trò chơi và các "khối màu" mà bạn muốn làm ...


2
Vì nó phát ra mã ANSI, nên nó có hoạt động trên Windows (bảng điều khiển DOS) nếu ansi.sys được tải không? support.microsoft.com/kb/101875
Phil P

37
Chỉ cần lưu ý rằng kể từ ngày 13/01/2011, giờ đây nó đã được cấp phép MIT
Alexander Tsepkov

12
không có unittests (không giống như colorama) và không được cập nhật kể từ năm 2011
Janus Troelsen

5
termcolor.COLORScung cấp cho bạn một danh sách các màu
akxlr

23
Trên Windows chạy os.system('color')trước, sau đó các chuỗi thoát ANSI bắt đầu hoạt động.
Szabolcs

717

Câu trả lời là Colorama cho tất cả các màu đa nền tảng trong Python.

Ảnh chụp màn hình ví dụ Python 3.6: ảnh chụp màn hình ví dụ


317
Là tác giả của Colorama, cảm ơn bạn đã đề cập đến @ nbv4. Tôi sẽ thử và làm rõ một chút: Colorama nhằm mục đích cho phép các chương trình Python in văn bản đầu cuối được tô màu trên tất cả các nền tảng, sử dụng cùng mã ANSI như được mô tả trong nhiều câu trả lời khác trên trang này. Trên Windows, Colorama loại bỏ các ký tự ANSI này khỏi thiết bị xuất chuẩn và chuyển đổi chúng thành các lệnh gọi win32 tương đương cho văn bản màu. Trên các nền tảng khác, Colorama không làm gì cả. Do đó, bạn có thể sử dụng mã ANSI hoặc các mô-đun như Termcolor và với Colorama, chúng 'chỉ hoạt động' trên tất cả các nền tảng. Là ý tưởng đó, dù sao đi nữa.
Jonathan Hartley

2
@Jonathan, Đây thực sự là một thư viện tuyệt vời! Khả năng đa nền tảng màu đầu ra Python thực sự rất đẹp và hữu ích. Tôi đang cung cấp các công cụ cho một thư viện tô màu cho giao diện điều khiển của chính nó. Tôi có thể chuyển hướng đầu ra của giao diện điều khiển đó đến thiết bị đầu cuối và tô màu đầu ra. Bây giờ tôi thậm chí có thể lên một thư viện và cho phép người dùng chọn màu. Điều này sẽ cho phép người mù màu đặt mọi thứ hoạt động để họ thực sự có thể nhìn thấy đầu ra chính xác. Cảm ơn
Demolishun

50
Điều này nên có trong thư viện tiêu chuẩn ... Tôi nghĩ hỗ trợ màu nền tảng chéo là quan trọng.
daviewales

5
Colorama thật tuyệt! Ngoài ra, hãy xem ansimarkup , được xây dựng trên colorama và cho phép bạn sử dụng một đánh dấu dựa trên thẻ đơn giản (ví dụ <b>bold</b>) để thêm kiểu vào văn bản đầu cuối
gvalkov

30
Điều này không hoạt động mà không gọi colorama.init (). Bỏ phiếu lên!
Smit Johnth

428

In một chuỗi bắt đầu một màu / kiểu, sau đó là chuỗi, sau đó kết thúc thay đổi màu / kiểu bằng '\x1b[0m':

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

Thành công với ví dụ nền xanh

Nhận một bảng các tùy chọn định dạng cho văn bản shell với mã sau:

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

Ví dụ sáng-tối (hoàn thành)

nhập mô tả hình ảnh ở đây

Ví dụ về bóng tối (một phần)

phần trên cùng của đầu ra


8
cái này hoạt động trong hầu hết các shell cũng như ipython, đủ tốt cho hầu hết các ứng dụng
bảnh bao

4
Cho tôi hỏi, đây là thiết bị đầu cuối nào?
FlipTack

4
nó di động thế nào
Ruggero Turra


203

Xác định một chuỗi bắt đầu một màu và một chuỗi kết thúc màu, sau đó in văn bản của bạn với chuỗi bắt đầu ở phía trước và chuỗi kết thúc ở cuối.

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

Điều này tạo ra các phần sau trong bash, urxvtvới bảng màu theo phong cách Zenburn:

màu sắc đầu ra

Thông qua thử nghiệm, chúng ta có thể có được nhiều màu sắc hơn:

ma trận màu

Lưu ý: \33[5m\33[6mđang nhấp nháy.

Bằng cách này, chúng tôi có thể tạo ra một bộ sưu tập đầy đủ màu sắc:

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'

Đây là mã để tạo thử nghiệm:

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

2
Làm thế nào bạn thực hiện nhấp nháy txt
WiLL_K

2
Những gì vỏ hoặc thiết bị đầu cuối làm cho nó nhấp nháy?
Zypps987

1
(u) rxvt chẳng hạn
qubodup

6
Các văn bản nhấp nháy hoạt động thực sự thực sự tốt. Làm thế nào để tôi dừng nó mặc dù? Tất cả các bản in liên tiếp đang nhấp nháy vì một số lý do. Thiết bị đầu cuối của tôi nghĩ rằng đó là thời gian tiệc tùng!
đội trưởng

3
Ở cuối chuỗi sẽ nhấp nháy, đặt \33[0mhoặc CENDở trên.
Stiffy2000

94

Bạn muốn tìm hiểu về trình tự thoát ANSI. Đây là một ví dụ ngắn gọn:

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

Để biết thêm thông tin, hãy xem http://en.wikipedia.org/wiki/ANSI_escape_code

Đối với một ký tự khối, hãy thử một ký tự unicode như \ u2588:

print(u"\u2588")

Để tất cả chúng cùng nhau:

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

3
Hãy thử def d(*v): return '\x1B['+';'.join(map(str, v))+'m'sau đóprint ' '.join([d(k,i)+str(i%10)+d(0) for i in range(30,38)+range(40,48) for k in range(2)])
Evgeni Sergeev

ý nghĩa của việc thiết lập lại ở đây là gì?
MohitC

72

Tôi đang phản hồi vì tôi đã tìm ra cách sử dụng mã ANSI trên Windows 10, để bạn có thể thay đổi màu văn bản mà không cần bất kỳ mô-đun nào không được tích hợp:

Dòng làm cho công việc này là os.system("")hoặc bất kỳ cuộc gọi hệ thống nào khác, cho phép bạn in mã ANSI trong Terminal:

import os

os.system("")

# Group of Different functions for 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!")

Lưu ý: Mặc dù điều này cung cấp các tùy chọn giống như các tùy chọn Windows khác, Windows không hỗ trợ đầy đủ mã ANSI, ngay cả với thủ thuật này. Không phải tất cả các màu trang trí văn bản đều hoạt động và tất cả các màu 'sáng' (Mã 90-97 và 100-107) hiển thị giống như các màu thông thường (Mã 30-37 và 40-47)

Chỉnh sửa : Cảm ơn @jl vì đã tìm ra một phương pháp thậm chí còn ngắn hơn.

tl; dr : Thêm os.system("")gần đầu tập tin của bạn.

Phiên bản Python: 3.6.7


2
Điều này hoạt động - Tôi thực sự ngạc nhiên khi lệnh màu cho phép mã ANSI trong thiết bị đầu cuối Windows, tôi đã đi nhiều năm mà không biết điều này là có thể - bản thân lệnh không đưa ra bất kỳ manh mối nào về việc này.
Stuart Axon

1
Đơn giản nhất, và hoạt động hoàn hảo. Cảm ơn.
Ari

3
Để rõ ràng, điều này sẽ chỉ hoạt động trên Windows 10.
Anaksunaman

2
Không hoạt động trong Windows 7 / 8.1.
Nikos

2
Cảm ơn rất nhiều vì câu trả lời của bạn, @SimpleBinary! Chơi xung quanh với câu trả lời của bạn, tôi thấy rằng bạn có thể đơn giản hóa if sys.platform.lower() == "win32": os.system('color')hơn nữa bằng cách thay thế nó bằng chỉ os.system(''). Không cần điều kiện và mã chạy trong cả Windows 10 và Linux (khi tôi đã kiểm tra nó). Như bạn có thể thấy, bạn không phải thực hiện một cuộc gọi hệ thống color. Các cuộc gọi đến dir, cd, abcdef, và chỉ là một công việc tốt chuỗi rỗng (mặc dù các chuỗi không rỗng có khả năng sẽ in ra bạn không muốn nhìn thấy).
JL

60

Cách yêu thích của tôi là với thư viện Blessings (tiết lộ đầy đủ: tôi đã viết nó). Ví dụ:

from blessings import Terminal

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

Để in gạch màu, cách đáng tin cậy nhất là in khoảng trắng với màu nền. Tôi sử dụng kỹ thuật này để vẽ thanh tiến trình trong mũi tiến bộ :

print t.on_green(' ')

Bạn cũng có thể in ở các vị trí cụ thể:

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

Nếu bạn phải làm quen với các khả năng của thiết bị đầu cuối khác trong quá trình chơi, bạn cũng có thể làm điều đó. Bạn có thể sử dụng định dạng chuỗi tiêu chuẩn của Python để giữ cho nó dễ đọc:

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

Điều hay ho của Blessings là nó hoạt động tốt nhất trên tất cả các loại thiết bị đầu cuối, không chỉ các thiết bị màu ANSI (cực kỳ phổ biến). Nó cũng giữ các chuỗi thoát không thể đọc được ra khỏi mã của bạn trong khi vẫn ngắn gọn để sử dụng. Chúc vui vẻ!


65
Đặt màu sắc như một tên hàm và không phải là một tham số là một thực tiễn đáng nghi ngờ.
LtWorf

1
@LtWorf: bạn có thể dễ dàng biến nó thành một tham số bằng cách sử dụng getattrnếu bạn cần nó. Hoặc nhiều khả năng, chỉ cần tạo chuỗi định dạng động thay thế.
jfs

8
@progo thực tế là bạn có thể làm điều đó không có nghĩa là bạn nên làm điều đó. Nó chung chung hơn nếu màu sắc là một tham số mà bạn có thể vượt qua.
LtWorf

2
Bạn can just passmột chức năng python.
MaxNoe

2
Lưu ý rằng nhập phước lành không hoạt động trên windows, vì vậy đừng sử dụng nó nếu tập lệnh của bạn cần đa nền tảng.
Adversus

58

sty tương tự như colorama, nhưng nó ít dài dòng hơn, hỗ trợ các màu 8bit24bit (rgb), cho phép bạn đăng ký các kiểu của riêng mình, hỗ trợ tắt tiếng, thực sự linh hoạt, được ghi chép tốt và hơn thế nữa.

Ví dụ:

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

in:

nhập mô tả hình ảnh ở đây

Bản giới thiệu: nhập mô tả hình ảnh ở đây


7
Sẽ rất hữu ích nếu bạn cân nhắc so sánh nó với colorama, tôi thích thư viện của bạn hơn, nhưng chỉ vì api ngắn hơn từ hộp, và sẽ thật tuyệt nếu nó sẽ phổ biến hơn. Cảm ơn!
Victor Gavro

Tôi thích sty và tôi đang cố gắng định dạng chuỗi của mình bằng sty, một vấn đề là, khi tôi in nhiều màu, tôi có thể đặt lại về màu trước thay vì màu mặc định không?
intijk

@VictorGavro Đó là một ý tưởng tốt! Tôi có thể thêm một so sánh với các tài liệu.
Rotareti

@intijk Câu hỏi của bạn không thực sự phù hợp với phần bình luận. Đối với loại câu hỏi này, vui lòng tạo Câu hỏi SO mới hoặc sử dụng trình theo dõi vấn đề github.
Rotareti

53

đã tạo một lớp với tất cả các màu bằng cách sử dụng vòng lặp for để lặp lại mọi kết hợp màu lên tới 100, sau đó viết một lớp có màu python. Sao chép và dán theo ý muốn của bạn, GPLv2 bởi tôi:

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'

44

Hãy thử mã đơn giản này

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

19
Gợi ý: xác định lambdas trả về chuỗi màu đó, thay vì in chúng trực tiếp, để nó có thể được sử dụng cùng với các chuỗi khác.
gustafbstrom

34

Trên Windows, bạn có thể sử dụng mô-đun 'win32console' (có sẵn trong một số bản phân phối Python) hoặc mô-đun 'ctypes' (Python 2.5 trở lên) để truy cập API Win32.

Để xem mã hoàn chỉnh hỗ trợ cả hai cách, hãy xem mã báo cáo bảng điều khiển màu từ Testoob .

ví dụ công ty:

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)

2
Thành thật mà nói đây chỉ là giải pháp hoạt động với windows. Tất cả các câu trả lời khác chỉ là bản sao của mỗi bà mẹ.
Danilo

FWIW, trên Windows, việc sử dụng ConEmu sẽ hỗ trợ các chuỗi ANSI ít hơn (ngoài một loạt các lợi thế khác so với thiết bị đầu cuối gốc). Vẫn còn tuyệt vời để có một giải pháp bản địa mặc dù.
Endre Cả

Tôi với Danilo.
Muhammad Ali

24

Hoàn toàn đơn giản dựa trên câu trả lời của @ joeld

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)

Sau đó chỉ

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

2
Điều này sẽ sập nếu bạn vượt qua nhiều hơn một đối số vị trí hoặc bất kỳ thứ gì khác ngoài loại chuỗi
Romain Vincent

@RomainVincent Sau đó, đừng vượt qua nhiều hơn một đối số vị trí hoặc bất cứ điều gì khác ngoài một chuỗi ty chờ đợi, đây là những printthay đổi ? Phản đối đã hủy bỏ.
wizzwizz4

1
@ wizzwizz4 Tôi không chắc ý của bạn với bình luận này là gì, dù sao tôi cũng không thấy vấn đề. Nếu bạn định đề xuất một lớp ..., để thay thế một phương thức đơn giản như in, bạn cũng có thể tránh làm cho nó dễ bị hỏng. Chỉ là ý kiến ​​của tôi.
Romain Vincent

1
@RomainVincent Tôi sẽ nói rằng sự phản đối của bạn là sai, nhưng để thay thế một chức năng linh hoạt như printngười ta cần đảm bảo sao chép đúng chức năng của nó.
wizzwizz4 18/03/19

1
@RomainVincent Thực hiện để sử dụng các đối số vô hạn: <code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)</ code>
Emilien Baudet

23

Tôi đã gói câu trả lời @joeld vào một mô-đun với các hàm toàn cầu mà tôi có thể sử dụng ở bất kỳ đâu trong mã của mình.

tập tin: 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

sử dụng như sau:

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

22

Đối với Windows, bạn không thể in ra bàn điều khiển với màu sắc trừ khi bạn đang sử dụng win32api.

Đối với Linux, nó đơn giản như sử dụng in, với các chuỗi thoát được nêu ở đây:

Màu sắc

Để nhân vật in như một cái hộp, nó thực sự phụ thuộc vào phông chữ bạn đang sử dụng cho cửa sổ giao diện điều khiển. Biểu tượng bảng Anh hoạt động tốt, nhưng nó phụ thuộc vào phông chữ:

#

21
# 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))

Văn bản thay đổi nền trước và nền, màu sắc 0..141 Văn bản thay đổi nền trước và nền, màu sắc 142..255


20

Tôi đã kết thúc việc này, tôi cảm thấy nó là sạch nhất:

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)

Điều này thực sự tốt để làm điều đó mà không cần gói bên thứ ba.
Jamie Counsell

20

Dựa trên câu trả lời @joeld, sử dụng 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

Ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây


Một số cập nhật color_printvới trình định dạng mới, ví dụ:

>>> 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']

Lưu ý: italic, fast blinkingstrikethroughcó thể không hoạt động trên tất cả các thiết bị đầu cuối, không làm việc trên Mac / Ubuntu.

Ví dụ

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

Ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây


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

Thử trực tuyến


Đây chỉ là cho python3? gặp lỗi trên sep = '' với python2
ScipioAfricanus

hoạt động hoàn hảo trong python3 ubfox 18.04
Julius Prayogo

18

lưu ý cách withtừ khóa kết hợp với các từ bổ nghĩa như thế này cần được đặt lại (sử dụng Python 3 và 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")

Đã thử colorama, được sử dụng print(Style.BRIGHT + "Header Test")print (Style.DIM + word)để tạo ra một dấu nhắc thực sự tốt đẹp.
Tom

Điều này sẽ cần phải thay đổi để sử dụng contextlibcho Py3.
con mèo

@cat: Từ phiên bản Python nào sẽ cần thiết?
Janus Troelsen

Tôi tin rằng 3 trở lên - nó nên có một @contextlib.contextmanagertrang trí trên đó, phải không?
mèo

1
@cat: Tại sao? Công trình tuyệt vời mà không có.
Janus Troelsen

17

Bạn có thể sử dụng triển khai Python của thư viện lời nguyền: http://docs.python.org/l Library / curses.html

Ngoài ra, chạy này và bạn sẽ tìm thấy hộp của bạn:

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

Cá nhân tôi nghĩ rằng thư viện 'lời nguyền' đã hoàn toàn bị lu mờ bởi 'phước lành', giống như cách 'yêu cầu' đã làm lu mờ 'urllib', v.v.
Jonathan Hartley

17

Bạn có thể sử dụng CLINT:

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

Nhận nó từ GitHub .


1
Liên kết đầu tiên đã biến mất nên tôi gỡ bỏ nó; liên kết GH vẫn tốt (mặc dù dự án đã được "lưu trữ" và về cơ bản bị bỏ rơi, từ những gì tôi có thể thu thập).
Giacomo Lacava

15

Tôi biết rằng tôi đến muộn. Nhưng, tôi có một thư viện tên là ColorIt . Nó là siêu đơn giản.

Dưới đây là một số ví dụ:

from ColorIt import *

# Use this to ensure that ColorIt will be usable by certain command line interfaces
initColorIt()

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

Điều này mang lại cho bạn:

Hình ảnh của ColorIt

Cũng đáng lưu ý rằng đây là nền tảng chéo và đã được thử nghiệm trên mac, linux và windows.

Bạn có thể muốn dùng thử: https://github.com/CodeForeverAndEver/ColorIt

Lưu ý: Nháy mắt, in nghiêng, in đậm, vv sẽ được thêm vào trong một vài ngày.


14

Nếu bạn đang lập trình một trò chơi có lẽ bạn muốn thay đổi màu nền và chỉ sử dụng khoảng trắng? Ví dụ:

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

Thông tin thêm về điều này có thể được tìm thấy ở đây- linux.byexamples.com/archives/184/ Kẻ
thực dụng

11

Nếu bạn đang sử dụng Windows, thì ở đây bạn đi!

# display text on a Windows console
# Windows XP with Python27 or Python32
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 ... ")

Nếu bạn muốn các màu khác nhau trên cùng một dòng, hãy xóa luồng đầu ra ở giữa các cuộc gọi:print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)
user2023861

11

Nếu bạn đang sử dụng Django

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

ảnh chụp nhanh:

hình ảnh

(Tôi thường sử dụng đầu ra màu để gỡ lỗi trên thiết bị đầu cuối máy chủ vì vậy tôi đã thêm nó.)

Bạn có thể kiểm tra nếu nó được cài đặt trong máy của bạn:
$ python -c "import django; print django.VERSION"
Để cài đặt, hãy kiểm tra: Cách cài đặt Django

Hãy thử một lần!!


10

Đây là một ví dụ đáng nguyền rủa:

import curses

def main(stdscr):
    stdscr.clear()
    if curses.has_colors():
        for i in xrange(1, curses.COLORS):
            curses.init_pair(i, i, curses.COLOR_BLACK)
            stdscr.addstr("COLOR %d! " % i, curses.color_pair(i))
            stdscr.addstr("BOLD! ", curses.color_pair(i) | curses.A_BOLD)
            stdscr.addstr("STANDOUT! ", curses.color_pair(i) | curses.A_STANDOUT)
            stdscr.addstr("UNDERLINE! ", curses.color_pair(i) | curses.A_UNDERLINE)
            stdscr.addstr("BLINK! ", curses.color_pair(i) | curses.A_BLINK)
            stdscr.addstr("DIM! ", curses.color_pair(i) | curses.A_DIM)
            stdscr.addstr("REVERSE! ", curses.color_pair(i) | curses.A_REVERSE)
    stdscr.refresh()
    stdscr.getch()

if __name__ == '__main__':
    print "init..."
    curses.wrapper(main)

Mã của bạn không thành công trong Windows (x64) với lỗi này: AttributionError: đối tượng 'mô-đun' không có thuộc tính 'trình bao bọc'
sorin

1
@Sorin Sbarnea: Theo đó để trăn nguyền rủa tài liệu chính thức trong docs.python.org/library/curses.html , module lời nguyền không được hỗ trợ trên các cửa sổ. Có thể bạn đã gặp lỗi này thay vì "Không có Mô-đun như vậy" hoặc đại loại như thế này, vì có lẽ bạn đã đặt tên cho tệp thử nghiệm của mình là "curses.py" để nó tự nhập.
nosklo

10

https://raw.github.com/foven/foven/master/foven/colors.py

"""
.. versionadded:: 0.9.2

Functions for wrapping strings in ANSI color codes.

Each function within this module returns the input string ``text``, wrapped
with ANSI color codes for the appropriate color.

For example, to print some text as green on supporting terminals::

    from fabric.colors import green

    print(green("This text is green!"))

Because these functions simply return modified strings, you can nest them::

    from fabric.colors import red, green

    print(red("This sentence is red, except for " + \
          green("these words, which are green") + "."))

If ``bold`` is set to ``True``, the ANSI flag for bolding will be flipped on
for that particular invocation, which usually shows up as a bold or brighter
version of the original color on most terminals.
"""


def _wrap_with(code):

    def inner(text, bold=False):
        c = code
        if bold:
            c = "1;%s" % c
        return "\033[%sm%s\033[0m" % (c, text)
    return inner

red = _wrap_with('31')
green = _wrap_with('32')
yellow = _wrap_with('33')
blue = _wrap_with('34')
magenta = _wrap_with('35')
cyan = _wrap_with('36')
white = _wrap_with('37')

10

asciimatics cung cấp hỗ trợ di động để xây dựng giao diện người dùng và hoạt ảnh văn bản:

#!/usr/bin/env python
from asciimatics.effects import RandomNoise  # $ pip install asciimatics
from asciimatics.renderers import SpeechBubble, Rainbow
from asciimatics.scene import Scene
from asciimatics.screen import Screen
from asciimatics.exceptions import ResizeScreenError


def demo(screen):
    render = Rainbow(screen, SpeechBubble('Rainbow'))
    effects = [RandomNoise(screen, signal=render)]
    screen.play([Scene(effects, -1)], stop_on_resize=True)

while True:
    try:
        Screen.wrapper(demo)
        break
    except ResizeScreenError:
        pass

Asciicast:

văn bản màu cầu vồng trong tiếng ồn ascii


10

Một mô-đun pypi khác bao bọc chức năng in python 3:

https://pypi.python.org/pypi/colorprint

Nó có thể sử dụng trong python 2.x nếu bạn cũng vậy from __future__ import print. Dưới đây là ví dụ python 2 từ trang pypi mô-đun:

from __future__ import print_function
from colorprint import *

print('Hello', 'world', color='blue', end='', sep=', ')
print('!', color='red', format=['bold', 'blink'])

Đầu ra "Xin chào, thế giới!" với các từ màu xanh lam và dấu chấm than đậm màu đỏ và nhấp nháy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.