LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> 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 8313×

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ů

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

29.12.2015 11:38 /Ondřej Čečák
Ještě posledních pár dní můžete přidávat příspěvky nebo nápady na Install Fest 2016, který se bude konat 5. a 6. března 2016.
Přidat komentář

8.12.2015 11:36 /Petr Ježek
Logické se stává realitou. LibreOffice a Thunderbird se mají dle článku na Redditu stát protiváhou MS řešení (MS Office a Outlook).
Přidat komentář

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

> Poslední diskuze

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

7.5.2016 14:58 / Teodor Komárek
Soubory

20.4.2016 0:07 / Jakub Cleing
Sázkový panel PHP FUSION

9.4.2016 9:43 / jiwopene@gmail.com
Re: problém s dpkg a nemožností instalovat

Více ...

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