Print in technicolor

È possibile con Pyhton, quando si lavora con il terminale, avere l’output di print() a colori?
Cerrrto! Cioè quasi. Nel senso che si può dire di sì con alcune limitazioni.
La solita googlata (come farei senza il Web e senza Google?) mi ha fatto scoprire questa piccola meraviglia: Python termcolor module di Konstantin Lepa. È un modulo piccolissimo ma fa tutto quello che mi serve. Visto che è alla versione 0.2 c’è da aspettarsi chissà quali funzionalità future ma va bene così.

Si può testarlo con il comando

python termcolor.py

Da me non funziona il blink (poco male) e il concealed è davvero nascosto e per vederlo si deve reindirizzare l’output su un file e aprirlo con un editor tipo gedit.


Ho fatto un po’ di prove e sono arrivato a questo (tc4.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from termcolor import colored

colors = lambda str, cols: colored(str, cols)
hcolors = lambda str, cols, attr: colored(str, cols, attrs = attr)
block_ch = lambda col: colored(u'\u2588', col)

print colors('test', 'red')
print hcolors('test', 'red', ['bold', 'dark'])
print 'adesso', hcolors('giallo', 'yellow',  ['reverse']), \
colors('verde', 'green'), hcolors('e blù', 'blue', ['bold', 'dark'])
print block_ch('red'), block_ch('yellow'), block_ch('blue')

che produce questo output
Volevo rimarcare due cose, soprattutto per me che sono lento di comprendonio:

  • a volte lambda serve, o è comunque comoda (nonché elegante);
  • la funzione block_ch() non è indispensabile ma ha una sua utilità, nell’immagine seguente la riga verde è data dal codice print block_ch('green') * 20


Ho anche provato a costruirmi delle varianti della print, con risultati alquanto mediocri, va benissimo termcolor.

Ci sarebbero anche gli effetti speciali, volendo, come in questo caso:

import curses

def main(stdscr):
    stdscr.clear()
    if curses.has_colors():
        for i in xrange(1, curses.COLORS):
            curses.init_pair(i, i, curses.COLOR_BLACK)
            stdscr.addstr("COLOR %d! " % i, curses.color_pair(i))
            stdscr.addstr("BOLD! ", curses.color_pair(i) | curses.A_BOLD)
            stdscr.addstr("STANDOUT! ", curses.color_pair(i) | curses.A_STANDOUT)
            stdscr.addstr("UNDERLINE! ", curses.color_pair(i) | curses.A_UNDERLINE)
            stdscr.addstr("BLINK! ", curses.color_pair(i) | curses.A_BLINK)
            stdscr.addstr("DIM! ", curses.color_pair(i) | curses.A_DIM)
            stdscr.addstr("REVERSE! ", curses.color_pair(i) | curses.A_REVERSE)
    stdscr.refresh()
    stdscr.getch()

if __name__ == '__main__':
    print "init..."
    curses.wrapper(main)

che produce questo:

No non l’ho scritto io, l’ho copiato da qui.

A cosa mira tutto questo? Sarà il tema di un prossimo post, promesso, anzi no, forse…

Completamente off-topic e personale
Quando si raggiunge una certa età non si ha più la resistenza di una volta, almeno questo è il mio caso. Dopo qualche ora di lavoro tutto quello che riesco a fare rientra nel capitolo “cazzeggio”, ecco un esempio recente qui.

Per cui, a rigore dovrei firmarmi come
Juhan van Juhan the guy that stikez 😉

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • artic80  Il 11 ottobre 2010 alle 12:03

    io direi:

    Juhan van Juhan the guy that stikez RULEGGIA!!!

  • juhan  Il 11 ottobre 2010 alle 12:08

    Com’è che si risponde in questi casi? LOL? ROTFL?
    E secondo Wikipedia (en): Lol is a Dutch word (not an acronym) which, coincidentally, means “fun” (“lollig” means “funny”). 😀

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: