LINUXSOFT.cz
Nazwa użytkownika: Hasło:     
    CZ UK PL

> 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 | czytane 13164×

RELATED ARTICLES KOMENTARZE   

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;

KOMENTARZE

Nie ma komentarzy dla tej pozycji.

Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
> Szukanie oprogramowania
1. Pacman linux
Download: 4873x
2. FreeBSD
Download: 9063x
3. PCLinuxOS-2010
Download: 8561x
4. alcolix
Download: 10943x
5. Onebase Linux
Download: 9656x
6. Novell Linux Desktop
Download: 0x
7. KateOS
Download: 6239x

1. xinetd
Download: 2411x
2. RDGS
Download: 937x
3. spkg
Download: 4751x
4. LinPacker
Download: 9961x
5. VFU File Manager
Download: 3196x
6. LeftHand Mała Księgowość
Download: 7200x
7. MISU pyFotoResize
Download: 2803x
8. Lefthand CRM
Download: 3560x
9. MetadataExtractor
Download: 0x
10. RCP100
Download: 3116x
11. Predaj softveru
Download: 0x
12. MSH Free Autoresponder
Download: 0x
©Pavel Kysilka - 2003-2024 | mailatlinuxsoft.cz | Design: www.megadesign.cz