web-dev-qa-db-fra.com

Comment utiliser la palette de couleurs du terminal avec des curses

Je ne parviens pas à faire fonctionner la palette de couleurs du terminal avec les malédictions.

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)

Ce script python donne l'écran suivant:

enter image description here

Cependant, j'ai plus de couleurs dans ma palette gnome-terminal. Comment puis-je y accéder dans les curses?

24
Chiel ten Brinke

Ce que j'ai compris par expérience sur mon propre PC (Ubuntu 14.04, python 3).

  • Il y a 256 couleurs (définies par les 8 premiers bits).
  • Les autres bits sont utilisés pour des attributs supplémentaires, tels que la mise en évidence.
  • Passer le nombre -1 lorsque la couleur revient aux couleurs d'arrière-plan et de premier plan par défaut.
  • La paire de couleurs 0 (mod 256) est fixée sur (-1, -1).
  • Les couleurs 0 à 15 sont les couleurs de la palette terminale.

Considérez le code de test suivant. Ajoutez ceci à votre .bashrc:

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

Mettez-le dans un fichier python et exécutez-le.

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)

Son exécution produira la sortie suivante.

screenshot

Comme vous le voyez, les paires de couleurs 1 à 16 sont la palette de couleurs terminale pour les couleurs de premier plan.

41
Chiel ten Brinke

La "palette de couleurs" du terminal est définie par l'application du terminal elle-même pour mapper les couleurs par défaut des curses aux "interprétations" spécifiques à l'application. Si vous utilisez du rouge, le terminal peut choisir de l'afficher en tant que bordeaux ou rouge cerise, ou si l'utilisateur le souhaite, quelque chose de complètement différent.

En d'autres termes, utilisez simplement les couleurs des malédictions (combinées avec ou sans les modificateurs lumineux ou clignotants) et les choses devraient fonctionner correctement.

Je crois que l'appel curses.use_default_colors() rend simplement la transparence disponible; c'est un appel direct à la fonction use_default_colors() ncurses API . Les couleurs ncurses sont par ailleurs basées sur une palette; vous devez définir vos propres attributs de couleur par numéro de paire avec curses.init_pair() appels , puis sélectionnez une paire de couleurs avec curses.color_pair() dans la palette pour afficher du texte avec cette paire spécifique; ou créer des attributs de texte directement pour un appel addstr() donné.

13
Martijn Pieters

Je mets actuellement ces lignes devant mon script.

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

Je ne sais pas si c'est la meilleure solution, mais au moins cela donne des paires de couleurs qui sont cohérentes avec la palette de couleurs terminale.

9
Chiel ten Brinke

Je n'ai pas les rep-points pour soumettre ceci comme un commentaire à l'excellente réponse de Chiel ten Brinke, donc je vais offrir ici une version plus utile de son script de couleur:

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

Vous pouvez utiliser le package culour en installant avec:

pip install culour

Et puis vous pouvez l'utiliser pour imprimer avec des couleurs aux malédictions:

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