přihlásit 13014/813920

GUI obecně

V dnešní době jsou moderní aplikace s grafickým uživatelským rozhraním (GUI). Myslím že nikomu nemusím vysvětlovat, co to je a jak to vypadá. V Pythonu lze samozřejmě GUI aplikace vytvářet. Je k tomu potřeba nějaký GUI toolkit, tedy knihovna pro tvorbu grafického rozhraní.

GUI aplikace jsou specifické tím, že jsou interaktivní a programují se trochu jinak, než dávkové aplikace, které se spustí, něco dělají a po skončení práce se ukončí. Dávkové aplikace je snazší naprogramovat a proto se programování učí na nich. Má-li člověk potom naprogramovat GUI aplikaci, může být trochu bezradný. Proto se pokusím shrnout základy a vysvětlit základní termíny.

Událost (event)

To že je aplikace interaktivní znamená, že je řízena událostmi. V praxi to funguje tak, že se GUI aplikace spustí, vytvoří své grafické prostředí a pak se přepne do režimu čekání na událost (event).

Událost může být spojena s aktivitou uživatele nebo systému. Například kliknutí na tlačítko je událost, kterou vyvolá uživatel. To že ze sítě přišly naší aplikaci nová data je událost systému. Různých typů událostí je celá řada, záleží na GUI toolkitu, které podporuje.

Handler (obsluha)

Programátor GUI aplikace musí události (na které chce reagovat) ošetřit. Dělá se to připojením handleru k události. Konkrétní provedení je závislé na GUI toolkitu, ale prakticky to znamená, že programátor dá GUI toolkitu na vědomí, když vznikne tato událost, spusť tuto funkci. Taková funkce se nazývá handler. Ten handler musí sám naprogramovat a tak určit, co se má provést.

GUI program se tak vlastně skládá z grafického rozhraní, společných dat a sady víceméně na sobě nazávislých funkcí, které se spouští podle vzniklých událostí.

Widget

Tvorba grafického rozhraní se podobá skládání skládačky. GUI toolkit nabízí sadu grafických prvků, které se nazývají widgety. Widget je prázdné okno aplikace, tlačítko, popisek a všechny ostatní viditelné grafické prvky. Widgety jsou ale i různé, pro uživatele, neviditelné prvky, obvykle to jsou různé kontejnery, do kterých se seskládají jiné widgety.

Layout (rozmístění)

Tyto kontejnery obvykle určují layout (rozmístění) widgetů v okně. Pro představu to může být třeba horizontální nebo vertikální box, do kterého když umístíme tlačítka, tak tyto jsou pak seřazeny vedle sebe nebo pod sebou, podle toho, jak to programátor chce a potřebuje.

Dialog

GUI aplikace často používají dialogová okna. V některých případech jde o typické situace, jako například dialog pro otevření souboru. Je zbytečné až nežádoucí, aby si je každý programátor psal po svém. Proto pro tyto typické situace jsou součástí GUI toolkitu připravena dialogová okna, která šetří práci a sjednocují uživatelské rozhraní. Alespoň v rámci jednoho GUI toolkitu.

Tvorba GUI

Programátor tedy má k dispozici sadu GUI prvků grafického rozhraní, které nějak seskládá, k událostem které mohou tyto prvky vyvolat napíše a připojí handlery a aplikaci má hotovu. Vlastně nic složitého.

Samotné seskládání prvků může udělat různými způsoby. Jsou tu dvě hlavní cesty, wysiwyg a programová.

wysiwyg cesta

Wysiwyg (neboli co vidíš, to dostaneš) cesta spočívá v použití nějakého designeru, což je aplikace která se trochu podobá grafickému editoru. Má panel nástrojů, pomocí kterých jednoduše kliknutím vytváří jedntlivé widgety a tyto postupně seskládá dohromady. U každého widgetu může vyvplat okno vlastností a nastavit mu různé parametry, včetně handlerů.

Takových designerů je celá řada a každý si to dělá trochu po svém. Výsledkem práce designeru může být kód celého program, nebo jen jeho kostra, do které programátor dopíše těla handlerů, nebo jen definiční soubor s návrhem GUI, který se použije v programu.

programová cesta

Programová cesta spočívá v tom, že programátor kód tvořící GUI napíše sám. Je to trochu náročnější na znalosti, wysiwyg cesta je pohodlnější a intuitivnější, ale je to zase flexibilnější a programátor má GUI pod větší kontrolou. Automatické generování kódu je nutně omezené.

objektově orientované programování

GUI je typický příklad, kde se optimálně hodí objektově orientované programování. Každý widget má řadu vlastností a představuje samostatný objekt. Řada widgetů má spoustu společných vlastností, třeba různé druhy tlačítek (klikací, zapínací, přepínací) jsou prakticky to samé, liší se jen v detailech chování. Zde je ideální využít dědičnost, kdy ze společného obecného tlačítka odvodí jeho zvláštní případy.

Když programátor není líný či neschopný (rozuměj nepoužívá wysiwig), může v tomto pokračovat a odvozovat si své vlastní widgety se speciálním chováním specifickým pro potřeby konkrétní aplikace. Když pak bude chtít toto chování upravit, změní jednu třídu a přizpůsobí se tomu všechny tyto prvky. U wysiwyg bude muset programátor speciální chování řešit pomocí handelru (který tak bude zbytečně složitý) a při úpravě bude muset upravit všechny handlery. To zhoršuje složitost a udržovatelnost kódu.

Odvozování vlastních widgetů se mi osvědčilo a proto osobně dávám přednost programové cestě. Designer použiju pro prvotní návrh GUI, jak by to asi mohlo vypadat a po získání představy ho napíšu ručně.


Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /web/htdocs2/wraithcz/home/www/python/data/sessions/sessions1.php on line 2