Tvorba aplikací a her s textovým uživatelským rozhraním s využitím knihovny Blessed

4. 5. 2021
Doba čtení: 25 minut

Sdílet

 Autor: Voltron project
Přes převahu aplikací s grafickým rozhraním stále vznikají aplikace používající pro komunikaci s uživatelem starý dobrý terminál. Dnes se seznámíme s knihovnou Blessed, která takové aplikace umožňuje tvořit v Pythonu.

Obsah

1. Tvorba aplikací a her s textovým uživatelským rozhraním s využitím knihovny Blessed

2. Knihovny pro ovládání textového terminálu

3. Knihovna Blessed se představuje

4. Instalace knihovny Blessed

5. Přečtení základních informací o terminálu

6. Vymazání vybrané logické části plochy terminálu

7. Změna stylu vypsaných textů

8. Změna barvy textu (popředí)

9. Změna barvy pozadí

10. Kombinace různých barev popředí (textů) a pozadí

11. 24bitové barvy v moderních emulátorech terminálu

12. 24bitové barvy na pozadí textu

13. Pojmenované barvy na popředí

14. Pojmenované barvy na pozadí

15. Zobrazení hypertextového odkazu

16. Obsah druhé (závěrečné) části článku

17. Repositář s demonstračními příklady

18. Články o tvorbě aplikací s grafickým uživatelským rozhraním

19. Články o tvorbě aplikací s textovým uživatelským rozhraním

20. Odkazy na Internetu

1. Tvorba aplikací a her s textovým uživatelským rozhraním s využitím knihovny Blessed

Již mnohokrát jsme se na stránkách Roota zabývali problematikou tvorby aplikací s plnohodnotným grafickým uživatelským rozhraním – viz též osmnáctou kapitolu s příslušnými odkazy, které se konkrétně týkají článků o grafickém uživatelském rozhraní v Pythonu. Ovšem existuje relativně velké množství aplikací popř. nástrojů či her, pro které může být vhodnější použít terminál, resp. konzoli. Příkladem jsou aplikace, k nimž se přistupuje přes SSH, systémové nástroje apod. Takové aplikace dělíme do dvou skupin. Do první skupiny spadají interaktivně či neinteraktivně ovládané aplikace s příkazovým řádkem. Příkladem takových aplikací mohou být správci balíčků (dnf, apt-get), které s uživatelem interagují pouze několika otázkami typu Y/N. Dalším příkladem je nástroj fdisk se složitějším systémem menu, z nichž se položka vybírá svým jménem (a nikoli například pohybem kurzoru).

dnf

Obrázek 1: Mnoho aplikací sice využívá rozšířených možností textových terminálů, ovšem stále se jedná spíše o neinteraktivní nástroje bez celoobrazovkového přístupu k terminálu. Příkladem je příkaz dnf, který může v některých případech zobrazit jednoduchou otázku a očekávat odpověď.

A do druhé skupiny aplikací určených pro běh v terminálu můžeme zařadit aplikace s plnohodnotným textovým uživatelským rozhraním neboli TUI (Text User Interface). Takových aplikací existuje celá řada. Zmínit můžeme zejména celoobrazovkové textové editory (pochopitelně včetně Vimu a Emacsu), Midnight Commander, nástroj Aptitude, ale i některé hry používající celoobrazovkový textový režim (0verkill, Rogue, Nethack, Angband, DoomRL atd.).

DoomRL

Obrázek 2: DoomRL – úvodní ASCII art je takřka dokonalý.

Textové uživatelské rozhraní je u některých aplikací volitelné. Dobrým příkladem takového typu aplikace je GNU Debugger, který buď pracuje v režimu příkazového řádku, nebo ho lze přepnout do režimu s celoobrazovkovým textovým uživatelským rozhraním. I o tvorbě těchto aplikací jsme se ve stručnosti již zmínili v souvislosti s balíčky GNU Readline a především prompt_toolkit. Odkazy na tyto články jsou obsahem devatenácté kapitoly.

gnu gdb

Obrázek 3: GNU Debugger po zobrazení textového uživatelského rozhraní (TUI) ve chvíli, kdy je nastaven breakpoint na vstupní bod (přesněji řečeno na první příkaz) ve funkci main. Na levém okraji se zobrazují jak breakpointy, tak i ukazatel na právě prováděný či krokovaný příkaz.

Poznámka: termín „celoobrazovkový“ nemá v kontextu dnešního článku takový význam, že by plocha aplikace pokryla celou plochu monitoru (jako například při přehrávání videa), ale že využije plochu terminálu. U reálných terminálů se skutečně jedná o celou obrazovku, ovšem dnes se naprostá většina uživatelů setká pouze s emulátorem terminálu, který sám může být zobrazen v oknu a neběží tedy (striktně řečeno) na celé obrazovce (ovšem i tohoto efektu je možné v případě potřeby dosáhnout).
Angband

Obrázek 4: Hra Angband s textovým uživatelským rozhraním ve verzi pro Linux – podrobnější charakteristiky hrdiny.

2. Knihovny pro ovládání textového terminálu

U obou dvou výše zmíněných typů aplikací je nutné umět do určité míry ovládat terminálový výstup, aby například bylo možné smazat znak/řádek, zvýraznit text změnou jeho stylu, barvy textu, barvy pozadí atd. A u aplikací s plnohodnotným textovým uživatelským rozhraním je pochopitelně nutné terminál ovládat do ještě větší míry, aby bylo možné pracovat s okny, menu, nápovědou a dalšími ovládacími prvky (widgety). Vzhledem k tomu, že se textové terminály vyvíjejí už velmi dlouho (minimálně od roku 1965, kdy vznikl první skutečný počítačový terminál IBM 2741 jako náhrada za dálnopisy) jsou rozdílné i jejich možnosti (vlastnosti) i způsob jejich ovládání (většinou s využitím řídicích kódů, dnes většinou založených na takzvaných escape sekvencích a několika dalších ASCII znacích).

ibm-4

Obrázek 5: Část sálového počítače IBM System/360 Model 40 (rok výroby 1964). V pozadí můžeme vidět jednotky s magnetickými pásky (model IBM 2401), ovládací panel je umístěn přímo za slečnou. A slečna sedí u dálnopisu, tedy přímého předchůdce počítačových terminálů.

Samozřejmě jsme mohli v průběhu předchozích desetiletí vidět snahu o sjednocení ovládání terminálů, která probíhala paralelně s vytvářením databáze obsahující vlastnosti terminálů (terminfo a termcap). Existují také knihovny, které programátora dokážou odizolovat od nízkoúrovňového přístupu k terminálům a jejich řízení s využitím řídicích kódů. Jedná se především o knihovnu curses a jejího následovníka ncurses (viz článek Psaní aplikací pro terminál: jak funguje knihovna ncurses, popř. o utility spouštěné z příkazového řádku (tput, tset, reset atd.).

mc

Obrázek 6: Midnight Commander je jedním z užitečných nástrojů postavených nad ncurses.

V dnešním článku se však zaměříme na popis jiné knihovny, resp. přesněji řečeno balíčku. Jedná se o knihovnu nazvanou Blessed, která je určena pro použití v aplikacích naprogramovaných v jazyku Python. Tato knihovna, a to včetně jejího jména, je inspirována knihovnou Blessed určenou pro programovací jazyk JavaScript, jejíž zaměření je ovšem poněkud odlišné, neboť JavaScriptová verze obsahuje velké množství ovládacích prvků, formulářů atd., dále rozšířených v knihovně Blessed-contrib. Ovšem podobných knihoven, více či méně inspirovaných právě knihovnou Blessed, postupně vzniklo větší množství.

Obrázek 7: Ovládací prvky vykreslené s využitím knihovny Blessed-contrib (JavaScript).
Zdroj: https://github.com/yaronn/blessed-contrib.

Za připomenutí stojí především knihovna termui určená pro použití v aplikacích naprogramovaných v jazyce Go, popř. knihovna tui-rs, která je naopak určena pro aplikace vyvinuté v programovacím jazyku Rust. Tyto knihovny poskytují zejména možnost posunu textového kurzoru po ploše terminálu, mazání a přidávání textu na určenou pozici, změnu stylu vykreslování, popř. změnu barvy pozadí a popředí, ale i pokročilejší operace s textovými plochami (okny), tvorbu animovaných prvků apod.

Obrázek 8: Ovládací prvky vykreslené knihovnou tui-rs.
Zdroj: https://github.com/fdehau/tui-rs.

Dnes si ukážeme pouze základní možnosti poskytované knihovnou Blessed pro Python. Pokročilejšími operacemi se budeme zabývat ve druhém (a současně i závěrečném) pokračování dnešního článku.

3. Knihovna Blessed se představuje

V dalším textu se budeme zabývat knihovnou Blessed určenou pro jazyk Python. Tato knihovna je jak svým rozsahem funkcí, tak i zaměřením odlišná od knihovny se stejným jménem; která je ovšem navržena pro použití z JavaScriptu, TypeScriptu či z dalších jazyků transpilovaných do JavaScriptu. Na rozdíl od knihoven zmíněných v předchozí kapitole je Blessed pro Python z pohledu uživatele pojata minimalistickým způsobem. Umožňuje totiž změnu stylu a barvy vypisovaných textů (což je vhodné i pro aplikace nepoužívající celoobrazovkové TUI), vymazání části plochy terminálu, přesun kurzoru na libovolné místo v terminálu a v neposlední řadě taktéž okamžitou reakci na stisk kláves (na rozdíl od čekání na Enter), popř. reakci na změnu velikosti okna terminálu. Kromě toho je možné zachytávat proud bajtů posílaných na standardní výstup. Většina těchto vlastností vyžaduje relativně složitou interní logiku, ovšem pro uživatele-programátora je použití těchto funkcí přímočaré.

Blessed lze použít například pro vývoj her či dalších aplikací, které potřebují „vykreslit“ nějaké grafy či diagramy. Naopak pokud pouze vyžadujete tvorbu TUI se standardními ovládacími prvky, může být výhodnější použít knihovnu prompt_toolkit – viz též kapitolu číslo 19.

4. Instalace knihovny Blessed

Instalace knihovny Blessed je snadná, protože tato knihovna je dostupná ve formě balíčku poskytovaného přes PyPi. Pro její instalaci tedy použijeme příkaz pip, resp. pip3, a to podle toho, jaké verze Pythonu jsou na systému nainstalovány a jaká verze je vybrána jako výchozí (instalaci je však pochopitelně možné provést i z virtuálního prostředí Pythonu):

$ pip3 install --user blessed
 
Collecting blessed
  Downloading https://files.pythonhosted.org/packages/26/35/a781470488a304f66843d328052b6cb22df7163246fb47a27bfb21fba4e6/blessed-1.18.0-py2.py3-none-any.whl (81kB)
    100% |████████████████████████████████| 81kB 778kB/s
Requirement already satisfied: six>=1.9.0 in ./.local/lib/python3.6/site-packages (from blessed)
Requirement already satisfied: wcwidth>=0.1.4 in ./.local/lib/python3.6/site-packages (from blessed)
Installing collected packages: blessed
Successfully installed blessed-1.18.0

Následně z interaktivní smyčky Pythonu ověříme, že nový balíček je skutečně dostupný. Spustíme REPL Pythonu:

$ python3
Python 3.9.4 (default, Apr  6 2021, 00:00:00)
[GCC 11.0.1 20210324 (Red Hat 11.0.1-0)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Type "help", "copyright", "credits" or "license" for more information.
 
>>>

Naimportujeme balíček nazvaný blessed:

>>> import blessed

Pokud při importu nedošlo k chybě, měla by být dostupná nápověda:

>>> help(blessed)
 
Help on package blessed:
 
NAME
    blessed - A thin, practical wrapper around terminal capabilities in Python.
 
DESCRIPTION
    http://pypi.python.org/pypi/blessed
 
PACKAGE CONTENTS
    _capabilities
    color
    colorspace
    formatters
    keyboard
    sequences
    terminal
    tests (package)
    win_terminal

Nejdůležitější třídou z tohoto balíčku je třída Terminal:

>>> help(blessed.Terminal)
 
Help on class Terminal in module blessed.terminal:
 
class Terminal(builtins.object)
 |  An abstraction for color, style, positioning, and input in the terminal.
 |
 |  This keeps the endless calls to ``tigetstr()`` and ``tparm()`` out of your code, acts
 |  intelligently when somebody pipes your output to a non-terminal, and abstracts over the
 |  complexity of unbuffered keyboard input. It uses the terminfo database to remain portable across
 |  terminal types.

5. Přečtení základních informací o terminálu

V praktické části článku si ukážeme některé možnosti použití knihovny Blessed. Nejprve získáme základní informace o použitém terminálu, a to přístupem k atributům width, height a number_of_colors:

import blessed
 
terminal = blessed.Terminal()
 
print("Resolution: {}x{} characters".format(terminal.width, terminal.height))
print("Number of colors: {}".format(terminal.number_of_colors))

Příklad výstupu pro xterm:

$ python3 terminal_info.py 
 
Resolution: 159x42 characters
Number of colors: 8
Poznámka: rozměry terminálu se mohou i po spuštění aplikace měnit, na což lze reagovat poněkud jiným způsobem, než je zde ukázáno. A navíc hlášený počet podporovaných barev není ve skutečnosti u některých terminálů korektní, neboť většině moderních emulací terminálu je možné „vnutit“ i větší počet barev (typicky true color, tedy 224 barev). Ukázka bude uvedena v navazujících kapitolách.

6. Vymazání vybrané logické části plochy terminálu

Knihovna Blessed obsahuje podporu pro čtveřici řídicích kódů, které slouží pro smazání určité vybrané plochy terminálu (resp. textu na této ploše). Tyto řídicí kódy jsou dostupné pod jmény clear, clear_eol, clear_bol a clear_eos:

# Atribut Stručný popis
1 clear smazání celé plochy terminálu
2 clear_eol smazání od pozice kurzoru do konce řádku
3 clear_bol smazání od pozice kurzoru na začátek řádku
4 clear_eos smazání od pozice kurzoru do konce obrazovky
Poznámka: skutečně se jedná o operaci smazání – smazaný text je ztracen, není uložen do schránky.

Pravděpodobně nejčastěji se setkáme s požadavkem smazání celé obrazovky, přesněji řečeno celé plochy terminálu. To je triviální úloha:

import blessed
 
terminal = blessed.Terminal()
 
print(terminal.clear)

7. Změna stylu vypsaných textů

Po inicializaci objektu typu Terminal je možné měnit styl textů vypisovaných aplikací funkcí print či podobnými funkcemi. K tomuto účelu slouží několik atributů objektu Terminal:

# Atribut Stručný popis
1 normal text s výchozím (běžným) stylem
2 bold tučný text, popř. změna kontrastu
3 reverse záměna barvy popředí a pozadí
4 underline podtržený text
5 no_underline opak předchozího atributu

Interně se jedná o řídicí kódy terminálu, takže tyto atributy můžeme použít například ve funkci print (v Pythonu 2 ve stejnojmenném příkazu):

import blessed
 
terminal = blessed.Terminal()
 
print(terminal.normal + "normal text")
print(terminal.bold + "bold text" + terminal.normal)
print(terminal.underline + "underlined text" + terminal.normal)
print(terminal.reverse + "reversed text" + terminal.normal)
print()
 
print(terminal.bold + "bold " + terminal.underline + "and underlined " + terminal.normal + "text")
print()
 
print(terminal.underline + "underlined " + terminal.reverse + "and reversed " + terminal.normal + "text")
print()
 
print(terminal.reverse + "reversed " + terminal.bold + "and bold " + terminal.normal + "text")

Výsledek (pro nakonfigurovaný xterm):

Obrázek 9: Základní styly vykreslení textů.

Výhodnější je však použití takzvaných f-řetězců, které nás odstíní od nutnosti volat metodu format nebo spojovat jednotlivé řídicí kódy s vlastním vypisovaným textem (pokud používáte novější verzi Pythonu):

import blessed
 
terminal = blessed.Terminal()
 
print(f"{terminal.normal}normal text{terminal.normal}")
print(f"{terminal.bold}bold text{terminal.normal}")
print(f"{terminal.underline}underlined text{terminal.normal}")
print(f"{terminal.reverse}reversed text{terminal.normal}")
print()
 
print(f"{terminal.bold}bold{terminal.underline} and underlined{terminal.normal} text")
print()
 
print(f"{terminal.underline}underlined {terminal.reverse}and reversed{terminal.normal} text")
print()
 
print(f"{terminal.reverse}reversed {terminal.bold}and bold{terminal.normal} text")

Výsledek by měl být totožný s předchozím příkladem:

Obrázek 10: Základní styly vykreslení textů vykreslené předchozím příkladem.

8. Změna barvy textu (popředí)

Prakticky všechny moderní terminály umožňují i změnu barvy vypisovaného textu. Na úrovni komunikace s terminálem se barvy mění posláním příslušného řídicího kódu (dnes nejčastěji escape sekvence), ovšem knihovna Blessed nás od těchto technických podrobností odstiňuje a umožňuje nám použít přímo atributy se jmény barev, které mohou být vytištěny například standardní funkcí print. Terminály, resp. dnes v naprosté většině případů emulátory terminálů, podporují různé počty barev – ty nejjednodušší a nejstarší pouze osm barev (buď pevně nastavených, nebo s volitelnou paletou), setkáme se i se šestnácti barvami (osm základních barev + jejich světlejší varianty), 256 barvami a moderní terminály od roku 2016 podporují i true color neboli 224 barvových odstínů.

Nejdříve si ukažme osm základních barev, které mají svá jména a dají se vybrat následovně:

import blessed
 
terminal = blessed.Terminal()
 
print(f"{terminal.black}black text{terminal.normal}")
print(f"{terminal.red}red text{terminal.normal}")
print(f"{terminal.green}green text{terminal.normal}")
print(f"{terminal.yellow}yellow text{terminal.normal}")
print(f"{terminal.blue}blue text{terminal.normal}")
print(f"{terminal.magenta}magenta text{terminal.normal}")
print(f"{terminal.cyan}cyan text{terminal.normal}")
print(f"{terminal.white}white text{terminal.normal}")

Podívejme se nyní na výsledek běhu tohoto příkladu:

Obrázek 11: Osm základních barev textu.

Poznámka: mnohé emulátory terminálů dokážou tyto logické barvy namapovat na barvy fyzické, což nemůžeme nijak ovlivnit. V praxi to tedy může znamenat, že uživatel zvolí, že logická červená barva se má zobrazit jako barva modrá atd.

Základních osm barev většinou existuje i ve světlejších odstínech, které lze zvolit zápisem prefixu bold, popř. bright. Opět platí, že konkrétní způsob zobrazení je závislý na nastavení daného terminálu a že jména logických barev nemusí odpovídat barvám skutečně zobrazeným (například xterm nerozezná „bright“ variantu a vyžaduje „bold“ variantu):

import blessed
 
terminal = blessed.Terminal()
 
print(f"{terminal.bold_black}black text{terminal.normal}")
print(f"{terminal.bold_red}red text{terminal.normal}")
print(f"{terminal.bold_green}green text{terminal.normal}")
print(f"{terminal.bold_yellow}yellow text{terminal.normal}")
print(f"{terminal.bold_blue}blue text{terminal.normal}")
print(f"{terminal.bold_magenta}magenta text{terminal.normal}")
print(f"{terminal.bold_cyan}cyan text{terminal.normal}")
print(f"{terminal.bold_white}white text{terminal.normal}")

Obrázek 12: Osm upravených barev textu atributem bold.

9. Změna barvy pozadí

Naprosto stejným způsobem, jako barvu textu (tedy popředí) je možné volit i barvu pozadí. Používají se i stejná jména barev, ovšem před jejich jméno je nutné zadat prefix on_, což znamená „zobrazeno na…“. Podívejme se nyní na zdrojový kód příkladu, v němž je použito osm základních barev pozadí:

import blessed
 
terminal = blessed.Terminal()
 
print(f"{terminal.on_black}black background{terminal.normal}")
print(f"{terminal.on_red}red background{terminal.normal}")
print(f"{terminal.on_green}green background{terminal.normal}")
print(f"{terminal.on_yellow}yellow background{terminal.normal}")
print(f"{terminal.on_blue}blue background{terminal.normal}")
print(f"{terminal.on_magenta}magenta background{terminal.normal}")
print(f"{terminal.on_cyan}cyan background{terminal.normal}")
print(f"{terminal.on_white}white background{terminal.normal}")

Obrázek 13: Osm základních barev pozadí.

I pro osm základních barev pozadí existuje „světlá“ nebo „tučná“ varianta, která je použita v následujícím skriptu:

import blessed
 
terminal = blessed.Terminal()
 
print(f"{terminal.bold_on_black}black background{terminal.normal}")
print(f"{terminal.bold_on_red}red background{terminal.normal}")
print(f"{terminal.bold_on_green}green background{terminal.normal}")
print(f"{terminal.bold_on_yellow}yellow background{terminal.normal}")
print(f"{terminal.bold_on_blue}blue background{terminal.normal}")
print(f"{terminal.bold_on_magenta}magenta background{terminal.normal}")
print(f"{terminal.bold_on_cyan}cyan background{terminal.normal}")
print(f"{terminal.bold_on_white}white background{terminal.normal}")

Obrázek 14: Osm základních barev pozadí modifikovaných atributem bold.

10. Kombinace různých barev popředí (textů) a pozadí

Barva popředí se volí nezávisle na barvě pozadí, popř. nezávisle na stylu vykreslení textu. V následujícím demonstračním příkladu je ukázáno, jak lze zobrazit všech 64 kombinací základních osmi barev popředí a pozadí:

import blessed
 
terminal = blessed.Terminal()
 
textColors = (
        terminal.black,
        terminal.red,
        terminal.green,
        terminal.yellow,
        terminal.blue,
        terminal.magenta,
        terminal.cyan,
        terminal.white,
)
 
backgroundColors = (
        terminal.on_black,
        terminal.on_red,
        terminal.on_green,
        terminal.on_yellow,
        terminal.on_blue,
        terminal.on_magenta,
        terminal.on_cyan,
        terminal.on_white,
)
 
for textColor in textColors:
    for backgroundColor in backgroundColors:
        print(f"{textColor}{backgroundColor}XXXXX{terminal.normal} ", end="")
    print()

Obrázek 15: 64 kombinací barev textu a pozadí.

11. 24bitové barvy v moderních emulátorech terminálu

V předchozích kapitolách jsme si řekli, že terminály většinou podporují osm, šestnáct, 256, popř. 224 barev (xterm pak 4096 barev). Knihovna Blessed dokáže pracovat s celým barvovým spektrem, tedy s oněmi více než šestnácti miliony barvových odstínů (záleží pak na konkrétním terminálu, zda dokáže všechny barvy zobrazit nebo například provede převod na nejbližší barvu z palety 4096 odstínů). Pro převod vlastní barvy (reprezentované většinou v barvovém prostoru RGB) na příslušný řídicí kód (escape sekvenci) slouží funkce nazvaná color_rgb. Tato funkce je použita v dalším demonstračním příkladu pro zobrazení části podporovaného barvového spektra (povšimněte si, že terminálu vnucujeme podporu pro celé barvové spektrum – což bude funkční například i na terminálu z Windows):

import blessed
 
terminal = blessed.Terminal()
 
terminal.number_of_colors = 1 << 24
 
for red in range(0, 256, 16):
    for green in range(0, 256, 16):
        for blue in range(0, 256, 16):
            hex_triplet = "#{:02x}{:02x}{:02x}".format(red, green, blue)
            print(terminal.color_rgb(red, green, blue) + hex_triplet, end=" ")
        print()
    print()
 
print()
print(f"{terminal.normal}DONE")

Obrázek 16: Část 24bitové barvové škály.

Obrázek 17: Část 24bitové barvové škály.

12. 24bitové barvy na pozadí textu

Z celého barvového spektra s šestnácti miliony odstínů je možné vybrat i barvu pozadí, což je ukázáno v dalším skriptu:

import blessed
 
terminal = blessed.Terminal()
 
terminal.number_of_colors = 1 << 24
 
for red in range(0, 256, 16):
    for green in range(0, 256, 16):
        for blue in range(0, 256, 16):
            hex_triplet = "#{:02x}{:02x}{:02x}".format(red, green, blue)
            print(terminal.on_color_rgb(red, green, blue) + hex_triplet, end=" ")
        print()
    print()
 
print()
print(f"{terminal.normal}DONE")

Obrázek 18: Část 24bitové barvové škály na pozadí.

Obrázek 19: Část 24bitové barvové škály na pozadí.

13. Pojmenované barvy na popředí

Z předešlého textu je zřejmé, že barvy jsou buď pojmenovány (osm základních barev), nebo je lze zvolit s využitím barvového prostoru RGB. Knihovna Blessed však jde ještě dále a nabízí uživatelům-programátorům i jména dalších barev a jejich odstínů. Tato jména jsou získána z „databáze“ používané systémem X a najdete je na adrese https://blessed.readthedoc­s.io/en/latest/colors.html#co­lor-chart.

Příklad použití (zdrojový text příkladu je v článku zkrácen):

import blessed
 
terminal = blessed.Terminal()
 
terminal.number_of_colors = 1 << 24
 
colors = (
    terminal.aliceblue,
    terminal.antiquewhite,
    terminal.antiquewhite1,
    terminal.antiquewhite2,
    terminal.antiquewhite3,
    terminal.antiquewhite4,
    terminal.qua,
    terminal.quamarine,
    terminal.quamarine1,
    terminal.quamarine2,
    terminal.quamarine3,
    terminal.quamarine4,
 
...
...
...
 
    terminal.yellow,
    terminal.yellow1,
    terminal.yellow2,
    terminal.yellow3,
    terminal.yellow4,
    terminal.yellowgreen)
 
for color in colors:
    print(color + "test")
 
print()
print(f"{terminal.normal}DONE")

Obrázek 20: Výsledek běhu předchozího demonstračního příkladu.

14. Pojmenované barvy na pozadí

Ukažme si i změnu pozadí s využitím existujících jmen barev a jejich odstínů. Platí přitom stále stejná jmenná konvence – před jméno barvy se zapíše prefix on_:

import blessed
 
terminal = blessed.Terminal()
 
terminal.number_of_colors = 1 << 24
 
colors = (
    terminal.on_aliceblue,
    terminal.on_antiquewhite,
    terminal.on_antiquewhite1,
    terminal.on_antiquewhite2,
    terminal.on_antiquewhite3,
    terminal.on_antiquewhite4,
 
...
...
...
 
    terminal.on_yellow,
    terminal.on_yellow1,
    terminal.on_yellow2,
    terminal.on_yellow3,
    terminal.on_yellow4,
    terminal.on_yellowgreen)
 
for color in colors:
    print(color + "test")
 
print()
print(f"{terminal.normal}DONE")

Obrázek 21: Výsledek běhu předchozího demonstračního příkladu.

15. Zobrazení hypertextového odkazu

Poslední funkce knihovny Blessed, s níž se dnes seznámíme, je podporovaná většinou moderních emulátorů terminálů. Jedná se o možnost zobrazení hypertextového odkazu, přesněji řečeno odkazu, jehož text (titulek) je odlišný od vlastní adresy (běžné adresy, resp. URL dokážou terminály detekovat samy). Hypertextový odkaz se vkládá metodou Terminal.link tak, jak je to ukázáno v dnešním posledním demonstračním příkladu. Této metodě se nejdříve předá adresa (URL) a poté text neboli titulek odkazu:

import blessed
 
terminal = blessed.Terminal()
 
print(f"Odkaz: {terminal.link('https://www.root.cz', 'Stránky Root.cz')}")
Poznámka: styl zobrazení odkazu (a to, zda se adresa zobrazí při přejetí kurzorem myši) je řízen nastavením terminálu.

16. Obsah druhé (závěrečné) části článku

Dnes jsme si popsali pouze základní funkce knihovny Blessed, které je možné použít pro změnu (vylepšení) zobrazení údajů na terminálu. To je však pouze malá část celkové funkcionality. Aby bylo možné vytvářet plnohodnotné celoobrazovkové aplikace, je nutné umět přesunout textový kurzor na libovolnou pozici na terminálu (sloupec, řádek), reagovat na stisk klávesy (a nikoli čekat na potvrzení Enterem), popř. reagovat na změnu velikosti okna terminálu. Tyto funkce budou popsány ve druhé a současně i poslední části mikroseriálku o knihovně Blessed.

17. Repositář s demonstračními příklady

Zdrojové kódy všech dnes popsaných demonstračních příkladů určených pro Python 3 byly uloženy do Git repositáře dostupného na adrese https://github.com/tisnik/most-popular-python-libs. V případě, že nebudete chtít klonovat celý repositář (ten je ovšem stále velmi malý, dnes má velikost zhruba několik desítek kilobajtů), můžete namísto toho použít odkazy na jednotlivé příklady, které naleznete v následující tabulce:

bitcoin_skoleni

# Jméno souboru Stručný popis souboru Cesta
1 terminal_info.py přečtení základních informací o terminálu https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/ter­minal_info.py
2 clear_screen.py smazání obrazovky terminálu https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/cle­ar_screen.py
       
3 text_styles1.py nastavení stylu vykreslení textu https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/tex­t_styles1.py
4 text_styles2.py použití https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/tex­t_styles2.py
       
5 basic8_colors.py základních osm barev textu podporovaných většinou terminálů https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/ba­sic8_colors.py
6 basic8_colors_bold.py modifikátor „bold“ ovlivňující barvu textu https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/ba­sic8_colors_bold.py
7 basic8_backgrounds.py základních osm barev pozadí podporovaných většinou terminálů https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/ba­sic8_backgrounds.py
8 basic8_bold_backgrounds.py modifikátor „bold“ ovlivňující barvu pozadí https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/ba­sic8_bold_backgrounds.py
9 basic8_combinations.py kombinace barev textu a barev pozadí (64 různých kombinací) https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/ba­sic8_combinations.py
       
10 palette.py plnohodnotná barvová paleta (true color) na popředí https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/palette.py
11 palette_background.py plnohodnotná barvová paleta (true color) na pozadí https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/pa­lette_background.py
12 named_colors.py použití jmen barev https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/na­med_colors.py
13 named_colors_background.py použití jmen barev pro specifikaci barvy pozadí https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/na­med_colors_background.py
       
14 hyperlink.py hypertextový odkaz v terminálu https://github.com/tisnik/most-popular-python-libs/blob/master/blessed/hyperlink.py

18. Články o tvorbě aplikací s grafickým uživatelským rozhraním

Tento článek se zabývá tvorbou aplikací s uživatelským rozhraním v Pythonu. Neškodí si proto připomenout, že právě pro Python existuje poměrně velké množství knihoven určených pro práci s grafickým uživatelským rozhraním. Mnohé z těchto knihoven jsme si již na stránkách Roota popsali, a to v následujících článcích:

  1. Knihovny pro tvorbu grafického uživatelského rozhraní v Pythonu
    https://www.root.cz/clanky/knihovny-pro-tvorbu-grafickeho-uzivatelskeho-rozhrani-v-pythonu/
  2. Grafické uživatelské rozhraní v Pythonu: knihovna Tkinter
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-knihovna-tkinter/
  3. Grafické uživatelské rozhraní v Pythonu: knihovna Tkinter (2.část)
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-knihovna-tkinter-2-cast/
  4. Grafické uživatelské rozhraní v Pythonu: knihovna Tkinter (3.část)
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-knihovna-tkinter-3-cast/
  5. Grafické uživatelské rozhraní v Pythonu: menu v knihovně Tkinter
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-menu-v-knihovne-tkinter/
  6. Grafické uživatelské rozhraní v Pythonu: kouzla s kreslicí plochou (canvasem)
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-kouzla-s-kreslici-plochou-canvasem/
  7. Grafické uživatelské rozhraní v Pythonu: kouzla s kreslicí plochou (2. část)
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-kouzla-s-kreslici-plochou-2-cast/
  8. Grafické uživatelské rozhraní v Pythonu: kouzla s kreslicí plochou (dokončení)
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-kouzla-s-kreslici-plochou-dokonceni/
  9. Grafické uživatelské rozhraní v Pythonu: další možnosti nabízené widgety Text a ScrolledText
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-dalsi-moznosti-nabizene-widgety-text-a-scrolledtext/
  10. Grafické uživatelské rozhraní v Pythonu: použití dialogových oken v knihovně Tkinter
    https://www.root.cz/clanky/graficke-uzivatelske-rozhrani-v-pythonu-pouziti-dialogovych-oken-v-knihovne-tkinter/
  11. Tvorba grafického uživatelského rozhraní v Pythonu s využitím knihovny appJar
    https://www.root.cz/clanky/tvorba-grafickeho-uzivatelskeho-rozhrani-v-pythonu-s-vyuzitim-knihovny-appjar/
  12. Tvorba grafického uživatelského rozhraní v Pythonu: widgety v knihovně appJar
    https://www.root.cz/clanky/tvorba-grafickeho-uzivatelskeho-rozhrani-v-pythonu-widgety-v-knihovne-appjar/
  13. Tvorba grafického uživatelského rozhraní v Pythonu: dokončení popisu widgetů v knihovně appJar
    https://www.root.cz/clanky/tvorba-grafickeho-uzivatelskeho-rozhrani-v-pythonu-dokonceni-popisu-widgetu-v-knihovne-appjar/
  14. Tvorba GUI v Pythonu: menu, toolbary a widgety pro vstup textu v knihovně appJar
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-menu-toolbary-a-widgety-pro-vstup-textu-v-knihovne-appjar/
  15. Tvorba GUI v Pythonu: widgety pro zobrazení tabulek a stromů v knihovně appJar
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-widgety-pro-zobrazeni-tabulek-a-stromu-v-knihovne-appjar/
  16. Tvorba GUI v Pythonu: widgety pro zobrazení grafických informací nabízené knihovnou appJar
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-widgety-pro-zobrazeni-grafickych-informaci-nabizene-knihovnou-appjar/
  17. Tvorba GUI v Pythonu: použití želví grafiky společně s knihovnou appJar
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-pouziti-zelvi-grafiky-spolecne-s-knihovnou-appjar/
  18. Tvorba grafického uživatelského rozhraní v Pythonu s využitím frameworku PySide
    https://www.root.cz/clanky/tvorba-grafickeho-uzivatelskeho-rozhrani-v-pythonu-s-vyuzitim-frameworku-pyside/
  19. Tvorba GUI v Pythonu s PySide: signály a sloty, správci rozložení komponent
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-s-pyside-signaly-a-sloty-spravci-rozlozeni-komponent/
  20. Tvorba GUI v Pythonu s PySide: další dostupné ovládací prvky
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-s-pyside-dalsi-dostupne-ovladaci-prvky/
  21. Tvorba GUI v Pythonu s PySide: přepínací tlačítka a tvorba hlavních oken aplikací
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-s-pyside-prepinaci-tlacitka-a-tvorba-hlavnich-oken-aplikaci/
  22. Tvorba GUI v Pythonu s PySide: hlavní menu, nástrojový pruh a výběrový seznam
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-s-pyside-hlavni-menu-nastrojovy-pruh-a-vyberove-seznam/
  23. Tvorba GUI v Pythonu s využitím frameworku PySide: rastrová a vektorová grafika
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-s-vyuzitim-frameworku-pyside-rastrova-a-vektorova-grafika/
  24. Tvorba GUI v PySide: grafické operace používající třídu QPainter
    https://www.root.cz/clanky/tvorba-gui-v-pyside-graficke-operace-pouzivajici-tridu-qpainter/
  25. Tvorba GUI v Pythonu s PySide: pokročilejší grafické operace používající třídu QPainter
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-s-pyside-pokrocilejsi-graficke-operace-pouzivajici-tridu-qpainter/
  26. Tvorba GUI v Pythonu s PySide: použití cest při kreslení 2D scén
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-s-pyside-pouziti-cest-pri-kresleni-2d-scen/
  27. GUI v Pythonu s PySide: rastrové operace, vykreslování textů
    https://www.root.cz/clanky/gui-v-pythonu-s-pyside-rastrove-operace-vykreslovani-textu/
  28. Tvorba GUI v Pythonu s využitím frameworku PySide: widgety pro textový vstup
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-s-vyuzitim-frameworku-pyside-widgety-pro-textovy-vstup/
  29. Složitější ovládací prvky ve frameworku PySide: tabulky a stromy
    https://www.root.cz/clanky/slozitejsi-ovladaci-prvky-ve-frameworku-pyside-tabulky-a-stromy/
  30. Další užitečné ovládací prvky nabízené frameworkem PySide
    https://www.root.cz/clanky/dalsi-uzitecne-ovladaci-prvky-nabizene-frameworkem-pyside/
  31. Standardní dialogy v knihovně PySide
    https://www.root.cz/clanky/standardni-dialogy-v-nbsp-knihovne-pyside/
  32. Konfigurace standardních dialogů nabízených knihovnou PySide
    https://www.root.cz/clanky/konfigurace-standardnich-dialogu-nabizenych-knihovnou-pyside/
  33. Nastavení stylů vykreslování widgetů, oken i dialogů v knihovně PySide
    https://www.root.cz/clanky/nastaveni-stylu-vykreslovani-widgetu-oken-i-dialogu-v-knihovne-pyside/
  34. Tvorba GUI v Pythonu: použití kaskádových stylů v PySide
    https://www.root.cz/clanky/tvorba-gui-v-pythonu-pouziti-kaskadovych-stylu-v-pyside/
  35. Práce s vektorovým formátem SVG ve frameworku PySide
    https://www.root.cz/clanky/prace-s-vektorovym-formatem-svg-ve-frameworku-pyside/
  36. Práce s vektorovým formátem SVG ve frameworku PySide (dokončení)
    https://www.root.cz/clanky/prace-s-vektorovym-formatem-svg-ve-frameworku-pyside-dokonceni/
  37. Použití UI souborů s popisem formulářů ve frameworku PySide
    https://www.root.cz/clanky/pouziti-ui-souboru-s-popisem-formularu-ve-frameworku-pyside/
  38. Jazyk QML (Qt Modeling Language) a PySide
    https://www.root.cz/clanky/jazyk-qml-qt-modeling-language-a-pyside/
  39. Jazyk QML (Qt Modeling Language) a PySide 2
    https://www.root.cz/clanky/jazyk-qml-qt-modeling-language-a-pyside-2/
  40. Reakce na události v GUI deklarované v jazyku QML a PySide 2
    https://www.root.cz/clanky/reakce-na-udalosti-v-gui-deklarovane-v-jazyku-qml-a-pyside-2/
  41. Interaktivní tvorba grafického uživatelského rozhraní nástrojem Pygubu
    https://www.root.cz/clanky/in­teraktivni-tvorba-grafickeho-uzivatelskeho-rozhrani-nastrojem-pygubu/
  42. Interaktivní tvorba grafického uživatelského rozhraní s využitím nástroje Pygubu (2)
    https://www.root.cz/clanky/in­teraktivni-tvorba-grafickeho-uzivatelskeho-rozhrani-s-vyuzitim-nastroje-pygubu-2/
  43. Interaktivní tvorba grafického uživatelského rozhraní s využitím nástroje Pygubu (dokončení)
    https://www.root.cz/clanky/in­teraktivni-tvorba-grafickeho-uzivatelskeho-rozhrani-s-vyuzitim-nastroje-pygubu-dokonceni/

19. Články o tvorbě aplikací s textovým uživatelským rozhraním

Na stránkách Roota jsme se zabývali taktéž některými knihovnami (opět určenými primárně pro Python), které je možné použít pro tvorbu aplikací s celoobrazovkovým (či chcete-li celoterminálovým) textovým uživatelským rozhraním. Podporu pro TUI poskytuje především knihovna prompt_toolkit:

  1. Tvorba aplikací s příkazovým řádkem v Pythonu s knihovnami GNU Readline a prompt_toolkit
    https://www.root.cz/clanky/tvorba-aplikaci-s-prikazovym-radkem-v-pythonu-s-vyuzitim-knihoven-gnu-readline-a-prompt-toolkit/
  2. Tvorba aplikací s textovým uživatelským rozhraním založeným na knihovně prompt_toolkit
    https://www.root.cz/clanky/tvorba-aplikaci-s-textovym-uzivatelskym-rozhranim-zalozenym-na-knihovne-prompt-toolkit/
  3. Tvorba textového rozhraní s knihovnou prompt_toolkit: základní prvky TUI
    https://www.root.cz/clanky/tvorba-textoveho-rozhrani-s-knihovnou-prompt-toolkit-zakladni-prvky-tui/
  4. Tvorba TUI s knihovnou prompt_toolkit: aplikace s celoobrazovkovým rozhraním
    https://www.root.cz/clanky/tvorba-tui-s-knihovnou-prompt-toolkit-aplikace-s-celoobrazovkovym-rozhranim/
  5. Tvorba textového uživatelského rozhraní s knihovnou prompt_toolkit: ovládací prvky (widgety)
    https://www.root.cz/clanky/tvorba-textoveho-uzivatelskeho-rozhrani-s-knihovnou-prompt-toolkit-ovladaci-prvky-widgety/

20. Odkazy na Internetu

  1. blessed na PyPi
    https://pypi.org/project/blessed/
  2. blessed na GitHubu
    https://github.com/jquast/blessed
  3. Blessed documentation!
    https://blessed.readthedoc­s.io/en/latest/
  4. termbox-go na GitHubu
    https://github.com/nsf/termbox-go
  5. termui na GitHubu
    https://github.com/gizak/termui
  6. blessed na GitHubu
    https://github.com/chjj/blessed
  7. blessed-contrib na GitHubu
    https://github.com/yaronn/blessed-contrib
  8. tui-rs na GitHubu
    https://github.com/fdehau/tui-rs
  9. Operace s framebufferem na Raspberry Pi
    https://www.root.cz/clanky/operace-s-framebufferem-na-raspberry-pi/
  10. Framebuffer na Raspberry Pi: vykreslování složitějších objektů
    https://www.root.cz/clanky/framebuffer-na-raspberry-pi-vykreslovani-slozitejsich-objektu/
  11. 256 COLORS – CHEAT SHEET
    https://jonasjacek.github.io/colors/
  12. Terminfo (Wikipedia)
    https://en.wikipedia.org/wi­ki/Terminfo
  13. Termcap (Wikipedia)
    https://en.wikipedia.org/wiki/Termcap
  14. Python 3's f-Strings: An Improved String Formatting Syntax (Guide)
    https://realpython.com/python-f-strings/
  15. Top 20 Best ASCII Games on Linux System
    https://www.ubuntupit.com/best-ascii-games-on-linux/
  16. 4 Python libraries for building great command-line user interfaces
    https://opensource.com/article/17/5/4-practical-python-libraries
  17. prompt_toolkit 2.0.3 na PyPi
    https://pypi.org/project/prom­pt_toolkit/
  18. python-prompt-toolkit na GitHubu
    https://github.com/jonathan­slenders/python-prompt-toolkit
  19. The GNU Readline Library
    https://tiswww.case.edu/php/chet/re­adline/rltop.html
  20. GNU Readline (Wikipedia)
    https://en.wikipedia.org/wi­ki/GNU_Readline
  21. readline — GNU readline interface (Python 3.x)
    https://docs.python.org/3/li­brary/readline.html
  22. readline — GNU readline interface (Python 2.x)
    https://docs.python.org/2/li­brary/readline.html
  23. GNU Readline Library – command line editing
    https://tiswww.cwru.edu/php/chet/re­adline/readline.html
  24. gnureadline 6.3.8 na PyPi
    https://pypi.org/project/gnureadline/
  25. Editline Library (libedit)
    http://thrysoee.dk/editline/
  26. Comparing Python Command-Line Parsing Libraries – Argparse, Docopt, and Click
    https://realpython.com/comparing-python-command-line-parsing-libraries-argparse-docopt-click/
  27. IBM 2741
    https://en.wikipedia.org/wi­ki/IBM_2741

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.