2013-08-31 58 views
16

我無法使用終端調色板來使用curses。如何在curses中使用終端調色板

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腳本產生了以下畫面:

enter image description here

不過,我也有我的gnome-terminal調色板更多的顏色。我如何在curses中訪問它們?

回答

29

下面我通過我自己的電腦上的實驗(Ubuntu 14.04,python 3)計算出來的。

  • 有256種顏色(由前8位定義)。
  • 其他位用於其他屬性,如突出顯示。
  • 傳遞數字-1作爲顏色回落到默認的背景和前景色。
  • 顏色對0(mod 256)固定在(-1,-1)上。
  • 顏色0到15是終端調色板的顏色。

請考慮以下測試代碼。 添加到您的.bashrc

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

在Python文件將這個並運行它。

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) 

運行它將產生以下輸出。

screenshot

正如所看到的,顏色對1-16是用於前景顏色終端調色板。

+1

你確定這是該屏幕截圖的代碼嗎?在我的系統(Ubuntu 12.04)中,'curses.COLORS'是8,而不是256,並且任何嘗試使用上面引發異常'_curses.error:init_pair()返回ERR'的顏色初始化對的嘗試。你正在使用什麼'curses'模塊,它是Python的stdlib中的默認模塊? – MestreLion

+0

是的,我確定這是正確的屏幕截圖。在我的ubuntu 14.04(使用python3)上再次運行它會得到相同的輸出。 'curses.COLORS'對我來說是256。 –

+0

Gnome終端默認使用'TERM = xterm-256color'也是如此?大!還是你手動添加到你的'〜/ .profile' /'〜/ .bashrc'?小心檢查這些文件是否有任何與「TERM」相關的代碼? – MestreLion

9

我目前把這些行放在我的腳本前面。

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

我不知道這是否是最好的解決方案,但至少它會產生一些與終端調色板一致的顏色對。

+0

這是一個很好的解決方案,因爲它分配第一8對他們的「匹配」前景色,使用缺省(可能透明的)背景。請注意,你可以有多於8對:這裏'curses.COLOR_PAIRS'返回'64'。快速初始化 – MestreLion

+0

很好的選擇..只是不知道是否有任何方式的關聯色數爲真正的顏色名稱(比如「紅」)在這裏..或只需要做試驗和錯誤..有任何默認順序這些顏色出現? – kollery

+0

AFAIK你能做的最好的是看使用從http://stackoverflow.com/a/22166613/1546844腳本的顏色,並設法找到模式,讓你做你想要的。每個終端可能有不同的顏色對應於什麼數字,我不確定。 –

9

終端的「調色板」由終端應用程序本身設置,以將默認的詛咒顏色映射到應用程序特定的「解釋」。如果您使用紅色,終端可以選擇以勃艮第或櫻桃紅色顯示,或者如果用戶願意,可以顯示完全不同的內容。

換句話說,只需使用curses顏色(結合使用或不使用亮或閃爍修飾符),而且應該只是工作。

我認爲curses.use_default_colors()調用只是使透明度可用;它是直接撥打use_default_colors() ncurses API function。 ncurses顏色是基於其他調色板的;您需要使用curses.init_pair() calls設置您自己的每對編號的顏色屬性,然後從調色板中選擇一個顏色對curses.color_pair()以顯示具有該特定對的文本;或者直接爲給定的addstr()調用建立文本屬性。

+1

那麼,我應該如何根據問題中的代碼使用這些顏色? –

+0

@ Chiel92:我可能錯過了一些東西; 'stdscr.can_change_color()'返回'True'嗎? –

+0

不,不... –

0

我沒有代表點提交此爲 Chiel 10 Brinke的出色答卷評論,所以我會在這裏提供他的顏色腳本更有用的版本:

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

你可以通過安裝使用culour包:

pip install culour 

然後你就可以用它來與彩色打印到詛咒:

culour.addstr(window, "colored string")