Câu hỏi In trong thiết bị đầu cuối với màu sắc?


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


1520
2017-11-13 18:58


gốc


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: nhiều nền tảng? mô-đun bên ngoài được chấp nhận là gì? - sorin
IPython thực hiện đ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ó thể bạn có thể làm cho nó hoạt động bằng cách sử dụng http://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
Câu trả lời này đến khá muộn, nhưng nó có vẻ là tốt nhất với tôi ... những người bình chọn ở trên nó yêu cầu hack đặc biệt cho Windows trong khi điều này chỉ hoạt động: stackoverflow.com/a/3332860/901641 - ArtOfWarfare


Các câu trả lời:


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

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

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

Nếu bạn đang đi để có được phức tạp với điều này (và nó có vẻ như bạn là nếu bạn đang viết một trò chơi), bạn nên nhìn vào các mô-đun "curses", xử lý rất nhiều các phần phức tạp của điều 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 (nghĩa là không phải trên PC), bạn bị mắc kẹt với các ký tự ascii dưới 127, và '#' hoặc '@' có lẽ là đặt cược tốt nhất của bạn cho một khối. Nếu bạn có thể đảm bảo thiết bị đầu cuối của bạn đang sử dụng một IBM bộ ký tự ascii mở rộng, bạn có nhiều tùy chọn hơn. 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, chẳng hạn như "Pháo đài lùn", mô phỏng chế độ văn bản ở chế độ đồ họa và sử dụng hình ảnh 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 Wiki pháo đài lùn xem (gạch do người dùng tạo).

Các Cuộc thi trình diễn văn bản có nhiều tài nguyên hơn để làm đồ họa ở chế độ văn bản.

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


1344
2017-11-13 19:25



cái gì disabled được dùng cho? - cregox
@Cawas Có vẻ với tôi như nó là để vô hiệu hóa màu cho tất cả các màu sắc được in bằng cách sử dụng một bcolors ví dụ. Ví dụ: bạn có thể tạo bcolors Ví dụ và sau đó sử dụng các biến thành viên của cá thể để in ra các ký tự tô màu của bạn, nhưng sau đó nếu bạn quyết định không muốn tô màu nữa, bạn có thể gọi disable trước khi in ra các ký tự và chúng sẽ in ra dưới dạng các chuỗi rỗng. - Steven Oxley
Chỉ cần lưu ý: Bạn cũng có thể thêm BOLD = "\033[1m" nếu bạn muốn văn bản in đậm (hữu ích cho tiêu đề). - crazy2be
Trên Linux, bạn có thể muốn sử dụng tput, như vậy vì nó mang lại nhiều mã di động hơn. - Martin Ueding
@ Cawas: Một trường hợp sử dụng thực sự cho disable là khi bạn đặt đầu ra cho một tệp; trong khi các công cụ như cat có thể hỗ trợ màu sắc, thường tốt hơn là không in thông tin màu vào tệp. - Sebastian Mach


Tôi ngạc nhiên không ai đề cập đến Mô-đun termcolor Python. Cách sử dụng khá đơn giản:

from termcolor import colored

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


556
2017-11-16 07:31



Điều này có hoạt động trên Windows không? - molasses
Yeah - không hoạt động trên Windows ... - stiank81
Kể từ khi nó phát ra mã ANSI, nó hoạt động trên Windows (console DOS) nếu ansi.sys được nạp? support.microsoft.com/kb/101875 - Phil P
Chỉ cần nhận thấy rằng kể từ ngày 13/01/2011, nó bây giờ theo giấy phép MIT - Alexander Tsepkov
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


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

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


482
2017-07-26 07:07



Là tác giả của Colorama, cảm ơn vì đã đề cập đến @ nbv4. Tôi sẽ cố gắng 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 màu trên tất cả các nền tảng, sử dụng cùng một 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 chặn các ký tự ANSI này từ stdout và chuyển đổi chúng thành các cuộc 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 các 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. Ý tưởng đó, dù sao đi chăng nữa. - Jonathan Hartley
Thư viện này là phải nếu bạn muốn sản lượng màu trên Windows mà không phiền phức! - leetNightshade
Điều này nên được trong thư viện chuẩn ... Cross hỗ trợ màu nền tảng là quan trọng, tôi nghĩ. - daviewales
Colorama là tuyệt vời! Ngoài ra có một cái nhìn tại ansimarkup, được xây dựng trên colorama và cho phép bạn sử dụng đá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
Điều này không làm việc mà không gọi colorama.init (). Bình chọn lên! - Smit Johnth


In chuỗi bắt đầu 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')

Success with green background example

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)

enter image description here

Ví dụ tối trên ánh sáng (một phần)

top part of output


282
2018-02-14 17:56



điều này làm việc trong hầu hết các shell cũng như ipython, đủ tốt cho hầu hết các ứng dụng - dashesy
tôi có thể hỏi, cái đầu cuối nào đây? - FlipTack
di động thế nào? - Ruggero Turra
Điều này hoạt động trên Raspberry PI 2. Cảm ơn bạn! :) - johnerfx
Triển khai độc lập ngắn: gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920 - Sheljohn


Bạn muốn tìm hiểu về các chuỗi 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, xem http://en.wikipedia.org/wiki/ANSI_escape_code

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

print u"\u2588"

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

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

71
2017-11-13 19:22



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 thiết lập lại ở đây là gì? - MohitC
@MohitC: wow. chín năm và bạn là người đầu tiên chú ý. Có vẻ như là một sai lầm. - Bryan Oakley


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

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

Điều này tạo ra những điều sau đây trong bash, trong urxvtvới bảng phối màu theo kiểu Zenburn:

output colors

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

color matrix

Chú thích: \33[5m và \33[6m đang nhấp nháy.

Bằng cách này, chúng ta 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

69
2017-09-12 14:00



bạn đã chớp mắt bằng cách nào - WiLL_K
Vỏ hoặc thiết bị đầu cuối nào làm cho nó nhấp nháy? - Zypps987
(u) rxvt ví dụ - qubodup
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 để ngăn chặn nó? Tất cả các bản in liên tiếp đang nhấp nháy vì một số lý do. Nhà ga của tôi nghĩ rằng đó là thời gian tiệc tùng! - nouveau
Ở cuối chuỗi được nhấp nháy, đặt \33[0m, hoặc là CEND ở trên. - Stiffy2000


Cách yêu thích của tôi là với Phước lành thư viện (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 các viên gạch màu, cách đáng tin cậy nhất là in không gian bằng các màu nền. Tôi sử dụng kỹ thuật này để vẽ thanh tiến trình 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 muck với các khả năng thiết bị đầu cuối khác trong quá trình trò chơi của bạn, bạn có thể làm điều đó là tốt. Bạn có thể sử dụng định dạng chuỗi chuẩn của Python để giữ cho nó có thể đọc được:

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

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


59
2017-12-18 00:32



Đặt màu như một tên hàm và không phải là tham số là một thực tế có vấn đề. - LtWorf
Phước lành là tuyệt vời! Tôi hiểu tại sao tên hàm là màu và cũng không phải là tham số. - Scalahansolo
@ LtWorf: bạn có thể dễ dàng biến nó thành thông số sử dụng getattr nế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
@ LtWorf: tại sao? Các hàm và phương thức của Python là các công dân hạng nhất - progo
@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 đó. Đó là chung chung hơn nếu màu sắc là một tham số mà bạn chỉ có thể vượt qua. - LtWorf


tạo ra một lớp với tất cả các màu sắc bằng cách sử dụng một vòng lặp for để lặp lại mọi kết hợp của màu lên đến 100, sau đó đã viết một lớp với các màu trăn. Sao chép và dán như bạn sẽ, GPLv2 của 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'

41
2017-10-18 23:26