2013-08-31 33 views
16

Tôi không thể lấy bảng màu của thiết bị đầu cuối để làm việc với các lời nguyền.Cách sử dụng bảng màu đầu cuối bằng các lời nguyền

import curses 

def main(stdscr): 
    curses.use_default_colors() 
    for i in range(0,7): 
     stdscr.addstr("Hello", curses.color_pair(i)) 
    stdscr.getch() 

curses.wrapper(main) 

python này kịch bản mang lại màn hình sau đây:

enter image description here

Tuy nhiên, tôi có nhiều màu sắc trong bảng màu gnome-terminal của tôi. Làm thế nào tôi có thể truy cập chúng trong lời nguyền?

Trả lời

29

Sau đây tôi đã tìm ra bằng thử nghiệm trên máy tính của riêng mình (Ubuntu 14.04, python 3).

  • Có 256 màu (được xác định bởi 8 bit đầu tiên).
  • Các bit khác được sử dụng cho các thuộc tính bổ sung, chẳng hạn như làm nổi bật.
  • Chuyển số -1 làm màu trở lại màu nền mặc định và màu nền trước.
  • Cặp màu 0 (mod 256) được cố định trên (-1, -1).
  • Màu 0 đến 15 là các màu của bảng màu đầu cuối.

Hãy xem xét mã thử nghiệm sau đây. Thêm phần này vào .bashrc của bạn:

# Set proper $TERM if we are running gnome-terminal 
if [ "$COLORTERM" == "gnome-terminal" ] 
then 
    TERM=xterm-256color 
fi 

Đặt điều này trong một file python và chạy nó.

import curses 

def main(stdscr): 
    curses.start_color() 
    curses.use_default_colors() 
    for i in range(0, curses.COLORS): 
     curses.init_pair(i + 1, i, -1) 
    try: 
     for i in range(0, 255): 
      stdscr.addstr(str(i), curses.color_pair(i)) 
    except curses.ERR: 
     # End of screen reached 
     pass 
    stdscr.getch() 

curses.wrapper(main) 

Chạy nó sẽ mang lại kết quả như sau.

screenshot

Như bạn thấy, màu sắc cặp 1-16 là những bảng màu thiết bị đầu cuối cho màu sắc foreground.

+1

Bạn có chắc chắn đây là mã cho ảnh chụp màn hình đó không? Trong hệ thống của tôi (Ubuntu 12.04), 'curses.COLORS' là 8, không phải 256, và bất kỳ nỗ lực nào để bắt đầu một cặp bằng cách sử dụng một màu ở trên mà ném ngoại lệ' _curses.error: init_pair() trả về ERR'. Bạn đang sử dụng module 'curses' nào, mô-đun mặc định từ stdlib của Python? – MestreLion

+0

Có, tôi chắc chắn đó là ảnh chụp màn hình chính xác. Chạy nó một lần nữa trên ubuntu của tôi 14.04 (sử dụng python3) mang lại kết quả tương tự. Và 'curses.COLORS' là 256 đối với tôi. –

+0

Vì vậy, Gnome Terminal cuối cùng có sử dụng 'TERM = xterm-256color' theo mặc định? Tuyệt quá! Hoặc bạn đã tự thêm nó vào '~/.profile' /' ~/.bashrc'? Bạn có thể kiểm tra các tệp đó cho bất kỳ mã liên quan đến 'TERM' nào không? – MestreLion

9

Tôi hiện đang đặt những dòng này ở phía trước tập lệnh của mình.

curses.use_default_colors() 
for i in range(0, curses.COLORS): 
    curses.init_pair(i, i, -1); 

Tôi không biết đó có phải là giải pháp tốt nhất hay không, nhưng ít nhất nó mang lại một số cặp màu phù hợp với bảng màu đầu cuối.

+0

Đó là một giải pháp tốt, vì nó gán 8 cặp đầu tiên cho màu nền trước "phù hợp" của chúng, sử dụng nền mặc định (có thể trong suốt). Chỉ cần lưu ý rằng bạn có thể có nhiều hơn 8 cặp: ở đây 'curses.COLOR_PAIRS' trả về' 64'. – MestreLion

+0

tùy chọn tuyệt vời để khởi tạo nhanh .. chỉ cần tự hỏi nếu có bất kỳ cách nào để liên kết số màu với tên màu thực (nói 'đỏ') ở đây .. hoặc chỉ phải thực hiện thử và lỗi .. có bất kỳ thứ tự mặc định nào không những màu này xuất hiện? – kollery

+0

Afaik tốt nhất bạn có thể làm là nhìn vào các màu sắc bằng cách sử dụng kịch bản từ http://stackoverflow.com/a/22166613/1546844 và cố gắng tìm các mẫu cho phép bạn làm những gì bạn muốn. Nó có thể khác nhau cho mỗi thiết bị đầu cuối những gì màu sắc tương ứng với những con số, tôi không chắc chắn. –

9

Bảng màu 'của thiết bị đầu cuối' được thiết lập bởi chính ứng dụng đầu cuối để ánh xạ mặc định cho các màu sắc vào 'cách diễn giải' dành riêng cho ứng dụng. Nếu bạn sử dụng màu đỏ, thiết bị đầu cuối có thể chọn hiển thị màu đỏ tía hoặc màu đỏ anh đào hoặc nếu người dùng mong muốn, một thứ hoàn toàn khác.

Nói cách khác, chỉ cần sử dụng các màu nguyền rủa (kết hợp có hoặc không có bộ sửa đổi sáng hoặc nhấp nháy) và mọi thứ sẽ chỉ hoạt động.

Tôi tin rằng cuộc gọi curses.use_default_colors() chỉ làm cho tính minh bạch khả dụng; nó là một cuộc gọi trực tiếp đến use_default_colors() ncurses API function. ncurses màu sắc là nếu không dựa trên bảng màu; bạn cần đặt các thuộc tính màu của riêng mình cho mỗi cặp số với curses.init_pair() calls, sau đó chọn một cặp màu với curses.color_pair() từ bảng màu để hiển thị văn bản với cặp cụ thể đó; hoặc xây dựng các thuộc tính văn bản trực tiếp cho một cuộc gọi addstr() nhất định.

+1

Vì vậy, làm thế nào tôi nên sử dụng các màu sắc trong điều khoản của mã trong câu hỏi? –

+0

@ Chiel92: Tôi có thể đã bỏ lỡ điều gì đó; hiện 'stdscr.can_change_color()' return 'True'? –

+0

Không, nó không ... –

0

Tôi không có đại diện-điểm nộp này như một bình luận cho câu trả lời tuyệt vời Chiel ten Brinke, vì vậy tôi sẽ cung cấp ở đây một phiên bản hữu ích hơn của kịch bản màu sắc của mình:

import curses 
def main(stdscr): 
    curses.start_color() 
    curses.use_default_colors() 
    for i in range(0, curses.COLORS): 
     curses.init_pair(i + 1, i, -1) 
    stdscr.addstr(0, 0, '{0} colors available'.format(curses.COLORS)) 
    maxy, maxx = stdscr.getmaxyx() 
    maxx = maxx - maxx % 5 
    x = 0 
    y = 1 
    try: 
     for i in range(0, curses.COLORS): 
      stdscr.addstr(y, x, '{0:5}'.format(i), curses.color_pair(i)) 
      x = (x + 5) % maxx 
      if x == 0: 
       y += 1 
    except curses.ERR: 
     pass 
    stdscr.getch() 
curses.wrapper(main) 
1

Bạn có thể sử dụng gói culour bằng cách cài đặt với:

pip install culour 

Và sau đó bạn có thể sử dụng nó để in với màu sắc để nguyền rủa:

culour.addstr(window, "colored string") 
Các vấn đề liên quan