LINUXSOFT.cz Přeskoč levou lištu

ARCHIV



   

> Perl (97) - Curses - tvorba textových uživatelských rozhraní

Perl Dnes se budeme zabývat tvorbou uživatelského rozhraní pomocí knihovny Curses.

18.1.2010 00:00 | Jiří Václavík | Články autora | přečteno 12563×

Curses je knihovna pro správu a řízení textového výstupu. Obvykle můžeme na výstup v terminálu pouze přidávat řádky a případně editovat poslední. Curses toto omezení odstraňuje a umožňuje nám libovolně měnit obsah po celé ploše terminálu.

Mezi základní vlastnosti knihovny Curses patří vytváření oken, používání různých stylů písma nebo práce s myší. Lze tedy vytvářet použitelná uživatelská rozhraní v textovém režimu.

Curses se asi nejčastěji používá v kombinaci s jazykem C. Nicméně díky modulu Curses, který je třeba získat z CPAN, lze tuto knihovnu používat i v kombinaci s Perlem.

V několika následujících dílech si tedy základy práce s Curses představíme. Nejprve budeme pracovat pouze s čistým Curses a v další části se soustředíme na knihovny Curses::UI, které obsahují několik již vytvořených widgetů, s kterými lze pracovat daleko rychleji.

Úvod do syntaxe

Na úvod si řekneme o několika nezbytných funkcích, jež modul Curses poskytuje. Ještě předtím upozorněme, že jména funkcí používaných v Perlu se občas liší od názvů funkcí v Curses pro C. Velmi často je například v názvy funkce vynechané podtržítko.

Funkce initscr inicializuje Curses režim. Tuto funkci budeme psát na začátek všech Curses programů. Obvykle má za následek vyprázdnění obrazovky.

Naopak poslední funkcí, kterou budeme v rámci Curses volat je endwin, která ukončuje Curses mód - dochází k takovým činnostem jako uvolnění paměti a návratu na původní obrazovku apod.

Pokud funkci endwin na konci programu neuvedeme, z terminálu se stane rozsypaný čaj. Proto se doporučuje uzavřít endwin do bloku END, čímž získáme jistotu, že bude proveden i v případě selhání programu.

END {
    endwin;
}

Dále zde je funkce printw, která tiskne předaný řetězec na výstup. Funkcí na tisk textu existuje více, patří mezi ně také addstr.

Na základě těchto informací napíšeme program, který pouze vytiskne text na výstup.

use Curses;

initscr;
END{endwin;}
printw("***Hello World***");

Po spuštění se zdá, jako by se nic nestalo. Je to tak proto, že program začal, nato vytiskl text a okamžitě se ukončil. Musíme ho proto něčím zdržet. Nejlepším řešením bude použití funkce getch, která čte klávesu ze vstupu. Přepišme tedy náš program tak, aby s ukončením počkal na stisk klávesy.

use Curses;

initscr;
END{endwin;}
printw("***Hello World***");
getch;

Základní vstup a výstup

Jak již bylo uvedeno výše, funkce getch vrací klávesu, která byla stisknuta.

initscr;
END{endwin;}

printw("Stiskni nějakou klávesu: ");
my $key = getch;
printw("\nStiskl jsi tuto klávesu: <$key>");

getch;

Dále zde máme funkcí getstr pro čtení celých řádků. Jejím parametrem je proměnná, kam se má řetězec uložit.

initscr;
END{endwin;}

addstr("Zadej řádek: ");
getstr($text);
printw("Napsal jsi: <$text>");

getch;

Funkce echo resp. noecho povolují resp. zakazují zobrazování vstupních kláves. Implicitně je nastaveno echo. noecho usnadňuje kontrolu nad výstupem a je dobré ho používat zejména u čtení funkčních kláves.

Detekce kláves

Funkce keypad(okno, true/false) umožňuje číst funkční klávesy, kurzorové klávesy apod.

Poslední zmiňované funkce si můžeme předvést na programu, který načítá a vypisuje znak tak dlouho, dokud není stisknuta klávesa F3, která má kód 267. Když neznáme kód, stačí si ho nechat vypsat v následujícím programu.

initscr;
END{endwin;}

noecho;
keypad(stdscr, 1);

while(($k = getch) != 267){
    printw("$k\n");
}

Abychom si nemuseli dohledávat kódy, lze použít v našem případě funkci KEY_F. KEY_F(3) vrátí hodnotu 267. Totéž jako předchozí lze tedy přepsat následovně.

initscr;
END{endwin;}

noecho;
keypad(stdscr, 1);

while(($k = getch) != KEY_F(3)){
    printw("$k\n");
}

Doba čekání na vstup

Upozorněme ještě na funkci timeout. Ta nastavuje, jak dlouho bude program čekat na vstup. Pokud nedojde k odeslání příslušných dat na vstup programu do určené doby (nastavené v milisekundách), už se žádný vstup vyžadovat nebude.

Například, chceme-li, aby uživatel zadal na vstup nějaký znak do 5 sekund, stačí před načtení vstupu uvést tento příkaz.

timeout(5000);

Pokud čas vyprší, do proměnné se uloží -1.

Styly písma

Písmu lze nastavit několik atributů. Funkce attron(ATRIBUT) zapíná určitou vlastnost a attroff(ATRIBUT) ji vypíná. Použijeme-li attrset (v dokumentaci má název attr_set), nastaví se uvedené vlastnosti oddělené bitovým NEBO (a ostatní vlastnosti se vypnou). V tabulce jsou uvedeny nejběžnější vlastnosti písma.

KonstantaVýznam
A_NORMALnastaví běžný text
A_STANDOUTnastavuje zvýraznění; na většině terminálů totožné s A_REVERSE
A_REVERSEprohodí barvu písma s pozadím
A_UNDERLINEpodtržené
A_BLINKblikání textu
A_BOLDbuď tučné písmo nebo zesvětlení
A_INVISneviditelné písmo
COLOR_PAIR(id)nastaví barevnou kombinaci číslo id; definicí barevných kombinací se budeme zabývat později

Předvedeme si názorně použití těchto tří funkcí a uvedených atributů. Spusťme následující program.

initscr;
END{endwin;}

printw("Normalni text\n");
attron(A_BOLD);
printw("Tucny text\n");
attron(A_UNDERLINE);
printw("Tucny a podtrzeny text\n");
attron(A_BLINK);
printw("Tucny, podtrzeny a blikajici text\n");
attron(A_STANDOUT);
printw("Jeste navic zvyrazneny text\n");
attroff(A_BLINK);
printw("Vypiname blikani\n");
attrset(A_BLINK | A_BOLD);
printw("Nyni je text pouze blikajici a tucny\n");

getch;

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

28.11.2018 23:56 /František Kučera
Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1

12.11.2018 21:28 /Redakce Linuxsoft.cz
22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář

6.11.2018 2:04 /František Kučera
Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář

4.10.2018 21:30 /Ondřej Čečák
LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář

18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář

9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business. Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář

12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář

16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

31.7.2023 14:13 / Linda Graham
iPhone Services

30.11.2022 9:32 / Kyle McDermott
Hosting download unavailable

13.12.2018 10:57 / Jan Mareš
Re: zavináč

2.12.2018 23:56 / František Kučera
Sraz

5.10.2018 17:12 / Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze