web-dev-qa-db-ja.com

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内でそれらにアクセスするにはどうすればよいですか?

24

以下は、自分のPCでの実験によってわかりました(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は、前景色のターミナルカラーパレットです。

41

端末の「カラーパレット」は、端末アプリケーション自体によって設定され、デフォルトのcurses色をアプリケーション固有の「解釈」にマップします。赤を使用する場合、端末はそれをバーガンディまたはチェリーレッドとして表示するか、ユーザーが望む場合はまったく異なるものを表示するように選択できます。

言い換えれば、cursesの色(brightモディファイアとblinkモディファイアの有無にかかわらず)を使用するだけで、問題なく機能するはずです。

curses.use_default_colors()を呼び出すと、透過性が利用可能になるだけだと思います。 use_default_colors() ncurses API関数 への直接の呼び出しです。それ以外の場合、ncursesの色はパレットベースです。 curses.init_pair() Calls でペア番号ごとに独自のカラー属性を設定し、次に curses.color_pair() でカラーペアを選択する必要があります特定のペアのテキストを表示するパレット。または、指定されたaddstr()呼び出しのテキスト属性を直接作成します。

13
Martijn Pieters

現在、これらの行をスクリプトの前に配置しています。

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

それが最善の解決策かどうかはわかりませんが、少なくとも、ターミナルのカラーパレットと一致するいくつかのカラーペアが得られます。

9

Chiel ten 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)
4
user1404316

culourパッケージを使用するには、次のようにインストールします。

pip install culour

そして、あなたはそれを呪いに色で印刷するために使うことができます:

culour.addstr(window, "colored string")
1
speller