Další GUI knihovnou, kterou lze používat v Perlu je Gtk2. Tento toolkit toho již dokáže opravdu mnoho a lze s ním psát plnohodnotné aplikace. Podívejme se, jak na to.
15.12.2010 00:00 | Jiří Václavík | přečteno 13025×
Sada knihoven GTK+ vznikla původně jako náhrada Motifu pro potřebu grafického editoru GIMP verze 1.0. Je výsledkem skupiny studentů XCF z univerzity v Berkeley z roku 1997. Z názvu Gimp také pochází zkratka GTK. Znamená totiž Gimp Tool Kit. Dnes patří GTK vedle Qt ke dvěma nejpoužívanějším toolkitům pro X11.
GTK+ je napsáno v jazyce C, avšak existují vazby na početnou skupinu známých jazyků. Pro zajímavost můžeme nahlédnout na oficiální stránku, kde je seznam podporovaných jazyků.
Projekt podpory Gtk2 v Perlu má oficiální stranku na gtk2-perl.sourceforge.net. Najdeme zde dokumentaci (ta se mi ovšem nezdá příliš vhodná pro ty, kteří s Gtk2 začínají) a případně další informace.
Gtk2 by ve většině distribucí již mělo být připraveno k použití. Je třeba mít nainstalovaný modul Gtk2, což lze uskutečnit tradičním příkazem cpan.
# cpan Gtk2
Kdo již Gtk2 zná (používal ji s jazykem C) a chce ho pouze používat v Perlu, může se podívat na změny mezi rozhraními. Používat původní dokumentaci zde totiž není příliš těžké. Stačí si zvyknout na několik pravidel. Velmi pěkně je udělaná také dokumentace PyGtk2, která má k perl-gtk2 ještě o něco blíže. Jak již bylo zmíněno, Existuje též oficiální POD dokumentace, avšak ta je užitečná pouze pro dohledávání syntaxe a vyžaduje již větší zkušenost Gtk2, neboť neobsahuje téměř žádné komentáře.
Gtk2 bezproblémově podporuje kódování utf-8. Proto není problém vytvářet aplikace s českou diakritikou (nebo prakticky libovolnými národními znaky). Potřebujeme k tomu dvě věci.
use utf8;
Je vhodné využívat předdefinované pravdivostní konstanty TRUE a FALSE, které exportujeme do programu následovně.
use Glib qw(TRUE FALSE);
Již tradičně začínáme u grafických knihovem programem, který zobrazí prázdné okno. Držme se této konvence dále a napišme nejjednodušší možnou grafickou aplikaci.
Již víme, že budeme v každém Gtk2 programu používat modul Gtk2.
use Gtk2;
Ve všech Gtk2 aplikacích se používá ještě jeden příkaz - init. Ten se se pokusí najít nějaký displej, kde se aplikace zobrazí (Mimo X Server nebo jiné grafické prostředí init selže; pomocí init_check můžeme zkontrolovat, zda je aktuálně takové prostředí dostupné - pokud není, může program pokračovat jinak a použít například textové rozhraní).
Gtk2->init;
Avšak místo něj lze volat use se speciálním parametrem, jak budeme často činit v budoucnu. Tím zredukujeme většinu aplikací o jeden řádek.
use Gtk2 "-init";
Program budeme ukončovat vždy vstupem do smyčky událostí. Pokaždé, když se program dostane k této smyčce, se zastaví a čeká na události, které vzápětí obsluhuje. Jakmile je obslouží, čeká na další události. To se opakuje až do ukončení programu.
Gtk2->main;
Zbývá vyřešit zobrazení okna. Okno je widget. Vytvoříme ho jako instanci Gtk2::Window. Konstruktoru předáme parametr typu Gtk2::WindowType, který může nabývat hodnot 'toplevel' nebo 'popup'. Každý widget nakonec zobrazíme pomocí metody show.
$okno = Gtk2::Window->new("toplevel");
$okno->show;
Dejme tedy dohromady všechny tyto poznatky. Náš úvodní Gtk2 program bude vypadat takto.
use Gtk2;
Gtk2->init;
$okno = Gtk2::Window->new("toplevel");
$okno->show;
Gtk2->main;
A výsledek? Po spuštění uvidíme dle očekávání prázdné okno.
První program v Gtk2 - prázdné okno
Metodou set_position nastavujeme pozici okna na displeji. Následující dva příklady budeme dále občas potřebovat.
$okno->set_position("center");
$okno->set_position("center-always");
Text se vytváří ve widgetu Gtk2::Label. Užitečné je, že text lze formátovat markup jazykem. Je to podstatně přímočařejší, než používat nějaké speciální metody. Pro úpravy textu jako je velikost písma, rodina písma, styl, barvy atd. lze používat značky podobné jako v HTML.
Důležité je, že každý widget musíme přiřadit do nějakého okna metodou add (později uvidíme, že lze přiřazovat i do jiných widgetů) a nechat ho zobrazit metodou show.
use Gtk2 "-init";
$okno = Gtk2::Window->new("toplevel");
$okno->set_border_width(20);
$label = Gtk2::Label->new();
$label->set_angle(44);
$label->set_markup("<b><i>pokus</i></b> <span background='green' foreground='Yellow'
size='large'><b>pokus</b></span> <s><span size='100000'>pokus</span></s>");
$okno->add($label);
$label->show;
$okno->show;
Gtk2->main;
Jak vidíme, styl, barvy, velikost stejně jako otočení a další parametry můžeme nastavovat velmi jednoduše.
Ukázka Gtk2::Label
Tlačítko je reprezentováno widgetem Gtk2::Button. Standardně tedy vytvoříme tlačítko.
$tlacitko = Gtk2::Button->new("Odeslat");
Tlačítko bychom vždy měli přiřadit nějakému oknu, kde se má zobrazit. Funguje to stejně, jako jsme to dělali u zobrazení textu. Provedeme to tedy metodou add.
$okno->add($tlacitko);
Samozřejmě nesmíme zapomenout na zobrazení tlačítka.
$tlacitko->show;
Jak tedy vypadá náš upravený program? Podívejme se na aktuální verzi zdrojového kódu.
use Gtk2;
Gtk2->init;
$okno = Gtk2::Window->new("toplevel");
$tlacitko = Gtk2::Button->new("Odeslat");
$okno->add($tlacitko);
$tlacitko->show;
$okno->show;
Gtk2->main;
Podívejme se, co se nám zobrazí po spuštění programu.
Okno s tlačítkem
Tlačítko je zde přes celé okno, což není příliš hezké. Přidejme si do okna rámeček.
$okno->set_border_width(20);
Když tento řádek připíšeme do programu, získáme okolo tlačítka kýžený rámeček.
Okno s tlačítkem
Metoda set_sensitive je přepínač pro aktivaci a deaktivaci tlačítek (nastavením na false zešednou a nepůjde na ně kliknout).