Tisk naformátovaného a obarveného textu na terminál s knihovnou Rich

18. 11. 2022
Doba čtení: 24 minut

Sdílet

 Autor: Depositphotos
Dnes se seznámíme s knihovnou Rich, která je určena pro použití v programech napsaných v Pythonu a slouží k tisku naformátovaného a obarveného textu na moderní terminály s podporou barev, Unicode a textových stylů.

Obsah

1. Tisk naformátovaného a obarveného strukturovaného textu na terminál s využitím knihovny Rich

2. Instalace knihovny rich

3. Vestavěné demo, spuštění tohoto dema na různých terminálech

4. Rozšířená a vylepšená funkce print

5. Způsoby importu a volání vylepšené funkce print

6. Logování nabízené knihovnou Rich

7. Tisk všech lokálních proměnných do logů

8. Výstup ve formátu JSON se zvýrazněním syntaxe

9. Tisk všech lokálních proměnných do JSONu

10. Užitečná funkce inspect

11. Výpis metod objektů funkcí inspect

12. Výpis interních atributů a metod funkcí inspect

13. Otestování možností funkce inspect na instanci standardní třídy Queue

14. Veřejné atributy instance třídy Queue

15. Metody objektu typu Queue s krátkým popiskem

16. Výpis privátních metod a atributů objektu typu Queue

17. Obsah navazujícího článku

18. Již vydané články o tvorbě GUI a TUI v Pythonu

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

20. Odkazy na Internetu

1. Tisk naformátovaného a obarveného strukturovaného textu na terminál s využitím knihovny Rich

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, které se konkrétně (resp. v největší míře) 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 „pouhý“ textový terminál, resp. textovou konzoli. Příkladem mohou být 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 však položka vybírá svým jménem (a nikoli například pohybem kurzoru).

dnf

Obrázek 1: Poměrně velké množství 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. Dobrým příkladem takových typů aplikací je příkaz dnf, který může v některých případech zobrazit jednoduchou otázku a „interaktivně“ 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í dnes existuje celá řada. Zmínit můžeme zejména celoobrazovkové textové editory (pochopitelně včetně Vimu a Emacsu), dále Midnight Commander, nástroj Aptitude, ale i některé hry používající celoobrazovkový textový režim (0verkill, Rogue, Nethack, Angband, DoomRL atd.). Částečně sem spadá i hra Dwarf Fortress, která by mohla běžet v terminálu, ale kvůli přenositelnosti používá vlastní engine založený na zobrazení textů.

DoomRL

Obrázek 2: DoomRL – úvodní ASCII art použitý v této hře 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 v případě potřeby 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 osmnácté kapitoly.

gnu gdb

Obrázek 3: Nástroj 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 textových terminálů (pamatuje si je někdo?) 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 okně 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.

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.).

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

Dnes se budeme zabývat knihovnou Rich, která je určena pro Python. Do jaké kategorie však tato knihovna spadá? Nejedná se v žádném případě o GUI knihovnu, ovšem současně se nejedná ani o knihovnu pro tvorbu plnohodnotného textového uživatelského rozhraní (TUI). Rich „pouze“ vylepšuje výstup naformátovaného textu na moderních terminálech, které (mnohdy) podporují plné barvy (true color), Unicode atd. A právě v této oblasti je Rich velmi dobrým pomocníkem (pravděpodobně nejlepším ve své kategorii).

Poznámka: dnes použité demonstrační příklady byly spuštěny v xtermu s nastavením světlého pozadí. Použité barvy se (podle očekávání) budou lišit ve chvíli, kdy bude použito tmavé pozadí, popřípadě odlišný emulátor terminálu – to je cena, kterou je nutné zaplatit (mj.) i za zpětnou kompatibilitu. I z tohoto důvodu jsou výsledky doplněny o terminál xfce4-terminal v jeho výchozím nastavení s tmavým pozadím.

Obrázek 7: Spuštění debuggeru, inicializace laděné aplikace, nastavení breakpointu a doskok na breakpoint.

2. Instalace knihovny rich

Knihovna Rich je dostupná na PyPi, takže je její instalace přímočará. V případě, že využijeme nástroj pip, resp. pip3, lze provést instalaci (pro právě přihlášeného uživatele) následujícím způsobem:

$ pip3 install --user rich
 
Collecting rich
  Downloading rich-12.6.0-py3-none-any.whl (237 kB)
     |████████████████████████████████| 237 kB 1.6 MB/s
Collecting typing-extensions<5.0,>=4.0.0; python_version < "3.9"
  Downloading typing_extensions-4.4.0-py3-none-any.whl (26 kB)
Collecting pygments<3.0.0,>=2.6.0
  Downloading Pygments-2.13.0-py3-none-any.whl (1.1 MB)
     |████████████████████████████████| 1.1 MB 2.5 MB/s
Collecting commonmark<0.10.0,>=0.9.0
  Downloading commonmark-0.9.1-py2.py3-none-any.whl (51 kB)
     |████████████████████████████████| 51 kB 3.9 MB/s
Installing collected packages: typing-extensions, pygments, commonmark, rich
Successfully installed commonmark-0.9.1 pygments-2.13.0 rich-12.6.0 typing-extensions-4.4.0
Poznámka: samozřejmě si můžete rich přidat do souboru requirements.txt a/nebo provést instalaci knihovny z virtuálního prostředí Pythonu:
$ virtualenv -p python3 venv && source venv/bin/activate && python3 `which pip3` install -r requirements.txt

To, zda je balíček skutečně dostupný přímo z Pythonu, si můžeme ověřit velmi snadno:

$ python3
 
Python 3.9.3 (default, Sep 22 2022, 23:10:10)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import rich
>>> help("rich")
 
Help on package rich:
 
NAME
    rich - Rich text and beautiful formatting in the terminal.
 
PACKAGE CONTENTS
    __main__
    _cell_widths
    _emoji_codes
    _emoji_replace
    _export_format
    _extension
    _inspect
...
...
...

3. Vestavěné demo, spuštění tohoto dema na různých terminálech

Knihovna rich obsahuje i vestavěné demo, které přímo na ploše terminálu ukáže některé její možnosti. Toto demo lze spustit následovně:

$ python3 -m rich

Na moderním terminálu, který podporuje plné barvy a Unicode, se zobrazí tento obsah:

Obrázek 8: Demo zobrazené na moderním terminálu.
Zdroj: stránky projektu Rich.

Na xtermu se světlým pozadím a podporou jen 88 barev dostaneme tento výstup:

Obrázek 9: Demo zobrazené na xtermu.

Obrázek 10: Demo zobrazené na xtermu.

Naproti tomu xfce4-terminal zobrazí text podobně, jako je tomu na osmém obrázku:

Obrázek 11: Demo zobrazené na xfce4-terminalu.

Obrázek 12: Demo zobrazené na xfce4-terminalu (povšimněte si, že vlajky nejsou v použitém fontu obsaženy).

4. Rozšířená a vylepšená funkce print

Prakticky každý začínající programátor zavolá ve svých prvních programech standardní funkci print:

Help on built-in function print in module builtins:
 
print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
 
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.

Tato funkce dokáže zobrazit hodnotu jakéhokoli typu, umožňuje přesměrovat výstup do souboru, volit, resp. modifikovat oddělovač záznamů atd. Ovšem její možnosti při výstupu na terminál (který už dávno není pouhým emulátorem dálnopisu) jsou limitovány – vypisované hodnoty jsou vypsány stejnou barvou a totožným typem písma atd. Ostatně se o tom můžeme snadno přesvědčit výpisem hodnot několika typů – seznamu, n-tice, slovníku a dalšího seznamu se „speciálními“ hodnotami:

a_list = [1, 2, 3, 4, 5]
print(a_list)
 
a_tuple = (1, 2, 3, 4, 5)
print(a_tuple)
 
a_dict = {'list': a_list, 'tuple': a_tuple, 'nil': None}
print(a_dict)
 
other_list = [True, False, None]
print(other_list)

Výsledky:

Obrázek 13: Standardní funkce print na xtermu.

Obrázek 14: Standardní funkce print na xfce4-terminalu.

5. Způsoby importu a volání vylepšené funkce print

Knihovna Rich nabízí svoji vlastní variantu funkce print, která dokáže zobrazované hodnoty (kromě dalších „vychytávek“) barevně zvýraznit, takže výsledky budou vypadat přehledněji:

Obrázek 15: Vylepšená funkce print na xtermu.

Obrázek 16: Vylepšená funkce print na xfce4-terminalu.

Poznámka: povšimněte si, jak se jak barvou, tak i stylem písma odlišují „speciální“ hodnoty.

Tuto funkci lze naimportovat například takto – tím se přepíše vazba na originální funkci print:

from rich import print
 
a_list = [1, 2, 3, 4, 5]
print(a_list)
 
a_tuple = (1, 2, 3, 4, 5)
print(a_tuple)
 
a_dict = {'list': a_list, 'tuple': a_tuple, 'nil': None}
print(a_dict)
 
other_list = [True, False, None]
print(other_list)

Alternativně je možné provést import stylem, jenž bude vyžadovat její volání společně s uvedením jmenného aliasu balíčku:

import rich
 
a_list = [1, 2, 3, 4, 5]
rich.print(a_list)
 
a_tuple = (1, 2, 3, 4, 5)
rich.print(a_tuple)
 
a_dict = {'list': a_list, 'tuple': a_tuple, 'nil': None}
rich.print(a_dict)
 
other_list = [True, False, None]
rich.print(other_list)

Nebo můžeme při importu zvolit nový jmenný alias importované funkce print:

from rich import print as rprint
 
a_list = [1, 2, 3, 4, 5]
rprint(a_list)
 
a_tuple = (1, 2, 3, 4, 5)
rprint(a_tuple)
 
a_dict = {'list': a_list, 'tuple': a_tuple, 'nil': None}
rprint(a_dict)
 
other_list = [True, False, None]
rprint(other_list)

6. Logování nabízené knihovnou Rich

V knihovně Rich nalezneme i další užitečné funkce a třídy. Příkladem může být třída Console, která dokáže na terminál vypsat (opět v přehledné podobě) jakoukoli hodnotu, přičemž formát odpovídá formátu, který očekáváme od logovacích informací (tedy například se použije časové razítko atd.). Ostatně se podívejme na následující demonstrační příklad, který ve funkci perform_computation vypíše „do logu“ obsah hodnoty uložené v lokální proměnné dictionary:

from rich.console import Console
 
console = Console()
 
 
def perform_computation(x, y):
    dictionary = {}
    dictionary["x"] = x
    dictionary["y"] = y
 
    try:
        z = x / y
        dictionary["result"] = z
        dictionary["success"] = True
    except Exception as e:
        dictionary["success"] = False
        dictionary["errors"] = e
 
    console.log(dictionary)
    return dictionary
 
 
perform_computation(1, 2)
perform_computation(1, 0)

Výsledek bude vypadat následovně (povšimněte si, že se zobrazí jak časové razítko, tak i řádek v kódu, který log vypsal):

Obrázek 17: Výpis na xtermu.

Obrázek 18: Výpis na xfce4-terminalu.

7. Tisk všech lokálních proměnných do logů

Pokud metodě Console.log předáme nepovinný parametr log_locals nastavený na hodnotu True, vypíšou se automaticky i hodnoty lokálních proměnných:

from rich.console import Console
 
console = Console()
 
 
def perform_computation(x, y):
    dictionary = {}
    dictionary["x"] = x
    dictionary["y"] = y
 
    try:
        z = x / y
        dictionary["result"] = z
        dictionary["success"] = True
    except Exception as e:
        dictionary["success"] = False
        dictionary["errors"] = e
 
    console.log(dictionary, log_locals=True)
    return dictionary
 
 
perform_computation(1, 2)
perform_computation(1, 0)

S výsledkem:

Obrázek 19: Výpis na xtermu.

Obrázek 20: Výpis na xfce4-terminalu.

V dalším příkladu jsou mezi jednotlivá volání funkce perform_computation vloženy pauzy, takže výstup bude odlišný (použijí se dvě časová razítka):

from rich.console import Console
from time import sleep
 
console = Console()
 
 
def perform_computation(x, y):
    dictionary = {}
    dictionary["x"] = x
    dictionary["y"] = y
 
    try:
        z = x / y
        dictionary["result"] = z
        dictionary["success"] = True
    except Exception as e:
        dictionary["success"] = False
        dictionary["errors"] = e
 
    console.log(dictionary, log_locals=True)
    return dictionary
 
 
perform_computation(1, 2)
sleep(1)
perform_computation(1, 0)
sleep(1)
perform_computation("foo", 0)

S výsledkem:

Obrázek 21: Výpis na xtermu.

Obrázek 22: Výpis na xfce4-terminalu.

8. Výstup ve formátu JSON se zvýrazněním syntaxe

Nepatrnou změnou, konkrétně náhradou volání metody Console.log za metodu Console.print_json, je možné zajistit, že hodnoty budou na terminál vypsány ve formátu JSON, takže jejich další zpracování může být snadnější:

from rich.console import Console
 
console = Console()
 
 
def perform_computation(x, y):
    dictionary = {}
    dictionary["x"] = x
    dictionary["y"] = y
 
    try:
        z = x / y
        dictionary["result"] = z
        dictionary["success"] = True
    except Exception as e:
        dictionary["success"] = False
        dictionary["errors"] = e
 
    console.print_json(data=dictionary)
    return dictionary
 
 
perform_computation(1, 2)
perform_computation(1, 0)

Povšimněte si, že se v tomto případě nemůže přímo pracovat s hodnotami typu Exception nebo s odvozenými hodnotami, což je poměrně problematický rys knihovny Rich:

Obrázek 23: Výpis na xtermu.

Obrázek 24: Výpis na xfce4-terminalu.

9. Tisk všech lokálních proměnných do JSONu

I u metody Console.proměnných je možné zobrazit obsah lokálních proměnných ve formátu JSON. Použijeme zde trik – předání pojmenovaného parametru data, jehož hodnotou bude výsledek volání locals():

from rich.console import Console
 
console = Console()
 
 
def perform_computation(x, y):
    dictionary = {}
    dictionary["x"] = x
    dictionary["y"] = y
 
    try:
        z = x / y
        dictionary["result"] = z
        dictionary["success"] = True
    except Exception as e:
        dictionary["success"] = False
        dictionary["errors"] = e
 
    console.print_json(data=locals())
    return dictionary
 
 
perform_computation(1, 2)
perform_computation(1, 0)

Výsledky budou v tomto případě vypadat následovně:

Obrázek 25: Výpis na xtermu.

Obrázek 26: Výpis na xfce4-terminalu.

10. Užitečná funkce inspect

Velmi užitečnou funkcí, kterou v knihovně Rich najdeme, je funkce, která se nazývá inspect. Tato funkce dokáže ve strukturované a snadno čitelné formě zobrazit prakticky jakékoli hodnoty a navíc nabízí i několik přepínačů:

Help on function inspect in rich:
 
rich.inspect = inspect(obj: Any, *, console: Union[ForwardRef('Console'), NoneType] = None, title: Union[str, NoneType] = None, help: bool = False, methods: bool = False, docs: bool = True, private: bool = False, dunder: bool = False, sort: bool = True, all: bool = False, value: bool = True) -> None
    Inspect any Python object.

    * inspect(<OBJECT>) to see summarized info.
    * inspect(<OBJECT>, methods=True) to see methods.
    * inspect(<OBJECT>, help=True) to see full (non-abbreviated) help.
    * inspect(<OBJECT>, private=True) to see private attributes (single underscore).
    * inspect(<OBJECT>, dunder=True) to see attributes beginning with double underscore.
    * inspect(<OBJECT>, all=True) to see all attributes.
 
    Args:
        obj (Any): An object to inspect.
        title (str, optional): Title to display over inspect result, or None use type. Defaults to None.
        help (bool, optional): Show full help text rather than just first paragraph. Defaults to False.
        methods (bool, optional): Enable inspection of callables. Defaults to Fa
        docs (bool, optional): Also render doc strings. Defaults to True.
        private (bool, optional): Show private attributes (beginning with underscore). Defaults to False.
        dunder (bool, optional): Show attributes starting with double underscore. Defaults to False.
        sort (bool, optional): Sort attributes alphabetically. Defaults to True.
        all (bool, optional): Show all attributes. Defaults to False.
        value (bool, optional): Pretty print value. Defaults to True.

Vyzkoušejme si například, jaké informace se zobrazí o třídě list:

from rich import inspect
 
inspect(list)

Obrázek 27: Výpis na xtermu.

Obrázek 28: Výpis na xfce4-terminalu.

11. Výpis metod objektů funkcí inspect

Třída list nabízí několik metod, které jsou veřejně dostupné. Funkce inspect dokáže nejenom zobrazit jména těchto metod, ale navíc dokáže i vypsat krátké anotace k těmto metodám. Ostatně se podívejme na následující kód, kde voláme funkci inspect s nepovinným parametrem methods nastaveným na hodnotu True:

from rich import inspect
 
inspect(list, methods=True)

Výsledek vypadá následovně:

Obrázek 29: Výpis všech veřejných metod třídy list.

12. Výpis interních atributů a metod funkcí inspect

V případě, že se funkci inspect předá (samozřejmě kromě zkoumaného objektu) i nepovinný atribut all=True, zobrazí se na terminálu mnohem větší množství informací, a to včetně všech atributů:

from rich import inspect
 
inspect(list, all=True)

V tomto případě budou informace zobrazené na ploše terminálu vypadat takto:

Obrázek 30: Výpis všech atributů a metod třídy list.

Poznámka: na screenshotu je uveden pouze výsek informací, protože ve skutečnosti zaberou plochu několika terminálů.

13. Otestování možností funkce inspect na instanci standardní třídy Queue

Některé další možnosti poskytované funkcí inspect si ukážeme na demonstračních příkladech, ve kterých se zkonstruuje instance standardní třídy Queue. Samotná funkce print totiž ani vzdáleně nedokáže vypsat informace o tomto objektu tak přehledně, jako to dokáže právě funkce inspect:

from queue import Queue
 
q = Queue()
 
q.put(42)
q.put(3.14)
q.put(True)
q.put(None)
 
print(q)
print(q.__dict__)

Výsledky v tomto případě nejsou v žádném případě přehledné:

<queue.Queue object at 0x7f3c8f268430>
 
{'maxsize': 0, 'queue': deque([42, 3.14, True, None]), 'mutex': <unlocked _thread.lock object at 0x7f3c8f23ba80>, 'not_empty': <Condition(<unlocked _thread.lock object at 0x7f3c8f23ba80>, 0)>, 'not_full': <Condition(<unlocked _thread.lock object at 0x7f3c8f23ba80>, 0)>, 'all_tasks_done': <Condition(<unlocked _thread.lock object at 0x7f3c8f23ba80>, 0)>, 'unfinished_tasks': 4}

14. Veřejné atributy instance třídy Queue

Výše uvedený výpis, který je z pohledu vývojáře dosti nepraktický, lze vylepšit právě funkcí inspect, která se v tom nejjednodušším případě zavolá takto:

from rich import inspect
from queue import Queue
 
q = Queue()
 
q.put(42)
q.put(3.14)
q.put(True)
q.put(None)
 
inspect(q)

Výsledkem bude relativně přehledný seznam veřejných atributů o tomto objektu:

Obrázek 31: Zobrazení veřejných atributů o instanci třídy Queue.

Poznámka: povšimněte si především toho, jak přehledně je zobrazen obsah atributu queue – jednotlivé typy hodnot jsou (rekurzivně) obarveny.

15. Metody objektu typu Queue s krátkým popiskem

Pro výpis veřejných metod objektu typu Queue na terminál se použije toto volání funkce inspect:

inspect(q, methods=True)

Podívejme se na úplný zdrojový kód jednoduchého příkladu, který toto volání realizuje:

from rich import inspect
from queue import Queue
 
q = Queue()
 
q.put(42)
q.put(3.14)
q.put(True)
q.put(None)
 
inspect(q, methods=True)

Výsledek (zobrazený na xtermu) bude v tomto případě vypadat následovně:

Obrázek 32: Zobrazení veřejných metod o instanci třídy Queue.

Poznámka: opět si povšimněte způsobu zvýraznění speciálních hodnot typu True, False a None.

16. Výpis privátních metod a atributů objektu typu Queue

Pro výpis veřejných ale i privátních metod je nutné použít, jak již ostatně víme, nepovinný parametr private nastavený na hodnotu True, tedy následovně:

from rich import inspect
from queue import Queue
 
q = Queue()
 
q.put(42)
q.put(3.14)
q.put(True)
q.put(None)
 
inspect(q, methods=True, private=True)

Výsledek zobrazený na xtermu se světlým pozadím:

Obrázek 33: Zobrazení veřejných i privátních metod o instanci třídy Queue.

A na závěr si ukažme, jak se vypíšou všechny veřejné i privátní atributy:

from rich import inspect
from queue import Queue
 
q = Queue()
 
q.put(42)
q.put(3.14)
q.put(True)
q.put(None)
 
inspect(q, all=True)

Povšimněte si, že výpis je zkrácen – ve skutečnosti v tomto případě zabere dvě výšky terminálu:

Obrázek 34: Zobrazení všech veřejných i privátních metod a atributů instance třídy Queue.

17. Obsah navazujícího článku

Dnes jsme si ve skutečnosti ukázali pouze naprosto základní funkce, které knihovna Rich programátorům nabízí. Ve druhém (a současně i posledním) článku o této knihovně si popíšeme zajímavější příklady, například to, jakým způsobem je možné zobrazit stromové struktury (a to je v praxi velmi důležité), jak se zobrazují tabulky s formátovaným textem, zobrazení dat umístěných do sloupců (tedy opět formátování textu) a v neposlední řadě si ukážeme například postupné zobrazení dokončené činnosti (progress bar).

18. Již vydané články o tvorbě GUI a TUI v Pythonu

Tento článek se zabývá tvorbou aplikací s textovým 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 i s uživatelským rozhraním textový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:

bitcoin školení listopad 24

  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/

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/

19. 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:

# Jméno souboru Stručný popis souboru Cesta
1 standard_print.py chování standardní funkce print https://github.com/tisnik/most-popular-python-libs/blob/master/rich/stan­dard_print.py
2 rich_print1.py první způsob importu a volání vylepšené varianty funkce print https://github.com/tisnik/most-popular-python-libs/blob/master/rich/rich_print1.py
3 rich_print2.py druhý způsob importu a volání vylepšené varianty funkce print https://github.com/tisnik/most-popular-python-libs/blob/master/rich/rich_print2.py
4 rich_print3.py třetí způsob importu a volání vylepšené varianty funkce print https://github.com/tisnik/most-popular-python-libs/blob/master/rich/rich_print3.py
5 console_log1.py zobrazení zvolené hodnoty na konzoli https://github.com/tisnik/most-popular-python-libs/blob/master/rich/console_log1.py
6 console_log2.py zobrazení zvolené hodnoty i lokálních proměnných na konzoli https://github.com/tisnik/most-popular-python-libs/blob/master/rich/console_log2.py
7 console_log3.py způsob práce s časovým razítkem https://github.com/tisnik/most-popular-python-libs/blob/master/rich/console_log3.py
8 console_json1.py tisk hodnot na konzoli ve formátu JSON https://github.com/tisnik/most-popular-python-libs/blob/master/rich/console_json1.py
9 console_json2.py tisk všech lokálních proměnných na konzoli ve formátu JSON https://github.com/tisnik/most-popular-python-libs/blob/master/rich/console_json2.py
10 inspect1.py funkce inspect a třída list https://github.com/tisnik/most-popular-python-libs/blob/master/rich/inspect1.py
11 inspect2.py funkce inspect; tisk všech viditelných metod třídy/objektu https://github.com/tisnik/most-popular-python-libs/blob/master/rich/inspect2.py
12 inspect3.py funkce inspect; tisk všech metod i atributů třídy/objektu https://github.com/tisnik/most-popular-python-libs/blob/master/rich/inspect3.py
13 inspect4.py funkce inspect; tisk instance třídy Queue https://github.com/tisnik/most-popular-python-libs/blob/master/rich/inspect4.py
14 inspect5.py funkce inspect; tisk všech metod instance třídy Queue https://github.com/tisnik/most-popular-python-libs/blob/master/rich/inspect5.py
15 inspect6.py funkce inspect; tisk všech privátních metod instance třídy Queue https://github.com/tisnik/most-popular-python-libs/blob/master/rich/inspect6.py
16 inspect7.py funkce inspect; tisk všech atributů i metod instance třídy Queue https://github.com/tisnik/most-popular-python-libs/blob/master/rich/inspect7.py

20. Odkazy na Internetu

  1. Repositář s knihovnou Rich
    https://github.com/Textualize/rich
  2. Knihovna Rich na PyPi
    https://pypi.org/project/rich/
  3. How to Use the Rich Library with Python
    https://www.freecodecamp.org/news/use-the-rich-library-in-python/
  4. Introduction (Rich, Readthedocs)
    https://rich.readthedocs.i­o/en/stable/introduction.html
  5. Awesome Python
    https://awesome-python.com/
  6. Python Awesome
    https://pythonawesome.com/about/
  7. Python Rich Library
    https://vegibit.com/python-rich-library/
  8. Python’s rich library – a tutorial
    https://softbranchdeveloper­s.com/pythons-rich-library-a-tutorial/
  9. blessed na PyPi
    https://pypi.org/project/blessed/
  10. blessed na GitHubu
    https://github.com/jquast/blessed
  11. Blessed documentation!
    https://blessed.readthedoc­s.io/en/latest/
  12. termbox-go na GitHubu
    https://github.com/nsf/termbox-go
  13. termui na GitHubu
    https://github.com/gizak/termui
  14. blessed na GitHubu
    https://github.com/chjj/blessed
  15. blessed-contrib na GitHubu
    https://github.com/yaronn/blessed-contrib
  16. tui-rs na GitHubu
    https://github.com/fdehau/tui-rs

Autor článku

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