È 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 😉
Commenti
io direi:
Juhan van Juhan the guy that stikez RULEGGIA!!!
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
[…] script usa il modulo termcolor (riga 8, ne ho parlato qui) per visualizzare una linea di separazione tra una ricerca e l’altra. Se si vuole si può […]
[…] Subito dopo mi sono detto che il prompt a colori sarebbe stato molto più bello. Avevo trattato l’argomento quando il blog era molto giovane, qui. […]
[…] https://okpanico.wordpress.com/2010/10/10/print-in-technicolor/ https://okpanico.wordpress.com/2013/12/21/repl/ […]