Právě jste dopsali svůj skvělý skript v BASHi. Všechno funguje, jak má, vychytali jste všechny mouchy, na které jste narazili, a s patřičně hrdým výrazem jej předvádíte budoucímu uživateli. A v tom okamžiku to přijde. Místo tisíců děkovných dopisů trapné ticho a pak dotaz, který byste nejraději neslyšeli: „Ono to nemá žádné okýnka s ovládáním?“. Zpropadení „klikoši“ s těmi jejich okýnky … taková neúcta ke kráse příkazového řádku. Co teď? Buď „klikoše“ ukamenujete palbou argumentů ve prospěch vašeho udělátoru bez GUI, nebo bez mrknutí oka pokýváte chápavě hlavou a rozšíříte skript o grafické rozhraní. Pokud patříte do druhé (chápající) skupiny programátorů a právě se rozhlížíte po nějakém grafickém rozhraní pro vaše skripty, pak by vám zcela jistě nemělo uniknout Zenity.
Pro rozsáhlejší aplikace s náročným ovládáním si pravděpodobně vyberete některý ze sofistikovanějších jazyků ve spojení s návrhářem GUI (Glade, QtDesigner apod.). Ovšem v případě, že vaše potřeby bohatě pokryje BASH, hodilo by se vám nějaké lehké funkční prostředí, které vám ono „klikací rozhraní“ zprostředkuje. Právě takovým dialogovým prostředím, založeným na rozhraní GTK+, je Zenity. V jeho portfoliu naleznete spoustu prvků, díky kterým své skripty učiníte uživatelsky přítulnější a přiblížíte je tak uživatelům zvyklým na grafické rozhraní. Co tedy Zenity nabízí? Stručně řečeno – dialogová okna.
Jedním z nejčastěji používaných dialogových oken jsou „informační okna“, popř. „chybová hlášení“, kterými se uživateli snažíme sdělit více či méně důležitou informaci. Pokud tedy chceme uživateli říci nějakou důležitou informaci, stačí použít následující kus kódu:
zenity --info --text "Čtěte pravidelně LinuxEXPRES!"
Informace
Varovat uživatele lze velmi podobně pomocí parametru warning:
zenity --warning --text "Čtení dalšího textu pouze na vlastní zodpovědnost\!";
Varování
Chybové hlášení pak opět vyvoláte téměř identicky (tentokrát s parametrem error):
zenity --error --text "Nečtete-li pravidelně LinuxEXPRES, \npřicházíte o zajímavé informace!"
kritická chyba
Všimněte si, že v chybovém hlášení je použit znak pro přechod na nový řádek (\n), tudíž lze text v dialogovém okně částečně formátovat.
Informace předávané uživateli jsou jistě důležitou součástí přívětivého prostředí, nicméně čas od času potřebujeme od uživatele také nějaké údaje získat. Pro tuto činnost máme připraveno několik prostředků. Pokud si vystačíme s odpovědí typu „ANO/NE“ (Budiž/Zrušit), máme v Zenity k dispozici formulář s otázkou (question):
odpoved=$(zenity --question --text "Jsou pro vás tyto informace užitečné?";echo $?)
Otázka ano-ne
Pokud bychom vstup od uživatele nechali ležet ladem, byl by nám asi houby platný. Proto kýženou hodnotu uložíme pro další zpracování do proměnné (ve výše uvedeném příkladu do proměnné odpoved). V případě, že potřebujeme od uživatele vyšší stupeň interakce a odpověď typu ANO/NE pro nás není dostačující, lze využít některou z dalších možností. Pravděpodobně nejtypičtějším představitelem této kategorie je klasický vstupní formulář (dialogové okno entry):
odpoved=$(zenity --entry --text "Jméno a příjmení: ")
Vstupní řádek
Vstupní formulář nám umožňuje rovněž definovat výchozí hodnotu pomocí parametru entry-text, která se uživateli zobrazí ve vstupním poli formuláře:
odpoved=$(zenity --entry --text "Jméno a příjmení: " --entry-text "Franta Jahoda")
Vstupní řádek a předvolený text
Dalším užitečným pomocníkem pro získání informací od uživatele je dialogové okno s kalendářem. Pomineme-li již několikrát zmíněnou přívětivost aplikace, má tento formulář přidanou hodnotu i v tom, že jím předané informace mají standardizovaný formát a nemusíme tudíž dumat nad tím, co nám uživatel v dobré víře zanechal za změť znaků. Kalendář opět vyvoláme velmi jednoduchým způsobem pomocí parametru calendar a jeho výstup přesměrujeme pro pozdější zpracování do proměnné.
Datum=$(zenity --calendar --text "Vyberte datum" --title "Datum: " --day 1 --month 5 --year 2008)
Kalendář
Parametry tohoto formuláře jsou poměrně snadno pochopitelné, nicméně pro upřesnění:
- title – titulek okna kalendáře
- text – informační text v okně kalendáře
- day, month, year – přednastavené hodnoty dne, měsíce a roku ve zobrazeném okně kalendáře
V případě, že od uživatele potřebujeme získat na vstupu číselný údaj z předem definovaného intervalu, může nám přijít vhod následující formulář ve formě jakéhosi tahového potenciometru či „šoupátka“ (scale):
odpoved=$(zenity --scale --text "Zadejte číslo od 1 do 10" --min-value=1 --max-value=10 --value=1 --step 1)
Šoupátko
Opět pro upřesnění význam jednotlivých parametrů:
- min-value – spodní hranice intervalu
- max-value – horní hranice intervalu
- value – výchozí hodnota
- step – krok o který se změní hodnota při pohybu „šoupátkem“
Kromě výše uvedených možností jednoduchých vstupů má Zenity v portfoliu svých formulářů rovněž metody vstupu pomocí seznamů několika hodnot (list), ať již ve formě radio-list (kdy vyžadujeme od uživatele právě jednu z možných odpovědí) nebo checklist (kdy dáváme uživateli možnost výběru více variant zároveň).
V případě, že se rozhodneme pro variantu s rádiovými tlačítky, stačí použít následující strukturu:
odpoved=$(zenity --list --text "Jak často čtete LinuxEXPRES?" --radiolist --column "Volba" --column "Odpověď" TRUE "Jednou za den" FALSE "Jednou za týden" FALSE "Jednou za měsíc" FALSE "Nečtu LinuxEXPRES")
Položky v seznamu
Seznam parametrů formuláře radiolist se skládá vždy z jednotlivých párů – logické a textové proměnné. V textových proměnných uvádíme varianty, ze kterých má uživatel vybírat („Jednou za den“, „Jednou za týden“) a logické proměnné určují výchozí stav radiového tlačítka u dané volby při zobrazení formuláře (TRUE – stisknuto, FALSE – uvolněno). Výsledkem formuláře radiolist je hodnota textové proměnné u stisknutého tlačítka (v případě, že je formulář uzavřen stisknutím tlačítka OK/Budiž), případně prázdný řetězec (v případě, že je formulář uzavřen uzavíracím křížkem, popř. stiskem tlačítka Cancel/Zrušit).
Vzhledem k charakteru formuláře radiolist je třeba dodržet pravidlo, že jen jedno tlačítko může být ve stavu „stisknuto“.
Pokud potřebujeme od uživatele získat více možných odpovědí zároveň, sáhneme po variantě checklist:
odpoved=$(zenity --list --text "Které rubriky vás nevíce zajímají?" --checklist --column "Volba" --column "Rubrika" TRUE "Praxe" FALSE "Jak na to" TRUE "Okénko do oken" FALSE "Hardware")
Položky seznamu, některé vybrané
Seznam parametrů formuláře checklist je totožný s výše uvedenou variantou radiolist pouze s jednou malou odlišností vyplývající z charakteru těchto formulářů - vzhledem k tomu, že u formuláře typu checklist lze očekávat více možných odpovědí, je možné ve výchozím zobrazení rovněž nastavit více zaškrtávacích polí jako zvolených (parametr TRUE). Výsledkem je v případě formuláře checklist řetězec obsahující hodnoty textových proměnných u zatržených boxů oddělené znakem roury ( | ).
Jak jste měli možnost vidět, lze pomocí formulářů poskytovaných programem Zenity vaše skripty v BASHi podstatným způsobem přiblížit běžnému uživateli a zjednodušit mu práci s nimi. Vzhledem k tomu, že tento článek si klade za cíl pouze krátké seznámení s možnostmi programu Zenity, nepostihuje všechny možnosti, které má případný programátor k dispozici. Pokud vás Zenity zaujalo a patříte mezi zvídavé jedince, doporučuji vám prostudovat manuálové stránky programu, kde najdete kompletní popis všech poskytovaných možností.