Hlavní navigace

Hrátky z řádky: dialog

Adam Štrauch 3. 11. 2008

Minulý týden jsme se podávali jak je možné ve skriptech vytvořit jednoduchý dialog, pro lepší orientaci uživatele. K představeným Qt a GTK variantám dnes přidáme ještě zástupce čistě textových dialogů, který je pro podobné skripty vhodnější alternativou než nabíhající okna. Výsledek je přitom podobný.

Úvod

Pro zopakování uvedu, o co se jedná. Dialog je program, který vývojáři systémových skriptů umožňuje vytvořit jednoduchý dialog, který může mít mnoho využití. Uživatelé si ani často neuvědomují, že s něčím podobným pracují, a přitom instalace binárních programů je často dělaná právě přes dialog. Vývojáři si podobné nástroje vybírají hlavně proto, že vytvoření jednoduchého dialogu je úkol na pár minut. Dialog je napsán pomocí knihovny ncurses, takže si řada uživatelů dokáže již představit, jak vypadá.

V případě programu Dialog může být výsledek například kalendář, textové okno, menu, progressbar a řada dalších. Na pár jednoduchých příkladech si ukážeme použití několika voleb, které Dialog nabízí.

Než začneme s příklady, prostudujeme si nápovědu k jednotlivým připraveným dialogům.

--calendar     Kalendář
--checklist    Seznam položek, ve kterém jich můžeme vybrat víc
--dselect      Výběr adresáře
--editbox      Editace souboru
--form         Vytvoří formulář
--fselect      Výběr souboru
--gauge        Progressbar na spodní části dialogu
--infobox      Informace
--inputbox     Dialog s otázkou
--inputmenu    Varianta menu dialogu
--menu         Varianta menu dialogu
--mixedform    Varianta na --form
--mixedgauge   --gauge a --menu dohromady
--msgbox       Boxík se zprávou
--passwordbox  Dialog s heslem
--passwordform Podobné jako --form, ale vstup je schovaný
--pause        sleep v dialogové podobě
--progressbox  Zobrazuje, co mu pošleme na vstup
--radiolist    Dialog s možností výběru pouze jedné položky
--tailbox      Výstup z tail -f
--tailboxbg    Podobné, ale tail -f je na pozadí
--textbox      Zobrazí obsah souboru
--timebox      Dialog s časem
--yesno        Ano/Ne dialog 

Přesné pořadí parametrů najdeme v manuálových stránkách nebo v nápovědě. Důležitou vlastností dialogu je, že můžeme kombinovat najedou několik dialogů, které se postupně zobrazí. Než začneme, povíme si něco o vstupu a výstupu dat.

Vstup a výstup

Dostat zadaná data z Dialogu není tak jednoduché jako u programů z minulého dílu tohoto seriálu, protože na standardní výstup jde o samotný dialog. Proto máme k dispozici následující volby:

--stdout     Zápis výstupu na standardní výstup
--stderr     Zápis na standardní chybový výstup
--output-fd  Zápis výstupu do file descriptoru 

Prostřední hodnota je nastavena ve výchozím stavu a je prakticky bezproblémová, pokud přesměrujeme stderr do souboru a data si vybere z něj. Pokud potřebujeme použít rouru, jediné řešení je stdout. To se ovšem nedoporučuje používat, protože se musí znovu otevřít terminál a tato procedura nemusí být všude funkční. Poslední možností je –output-fd. Pokud k tomuto parametru předáme tzv. file descriptor, dostane se výstup na něj. File descriptor je číslo označující výstup.

1            Standardní výstup (stdout)
2            Standardní chybový výstup (stderr)
3,4,5,...    Další uživatelsky definovatelné výstupy 

Příklad s použitím file descriptoru můžeme najít níže.

Jednoduché dialogy

Informační boxík

Stejně jako u jiných podobných nástrojů, tak i Dialog umí zobrazit jednoduché informační okénko a s tím také začneme jako s nejjednodušší ukázkou.

dialog --msgbox "Tohle je informační box" 6 35 

Prvním parametrem řekneme Dialogu, že budeme chtít informační boxík, další dva označují jeho velikost. První číslo značí výšku a druhou šířku. Nesmíme zapomínat, že velikost se označuje ve znacích.

Kalendář

Malinko složitější je kalendář, který vytvoříme takto:

dialog --output-fd 3 --calendar "Můj kalendář" 1 20 24 12 2008 3> /tmp/out 

Jako výstup jsme zvolili file descriptor s číslem tři a také z něj uložili výstup do /tmp/out. Kalendář máš podobné parametry jako –msgbox. První parametr je popisek, další dva velikost a poslední tři označují datum.

Čas

Dialog pro čas se vytváří podobně jako ten s kalendářem.

dialog --timebox "Časový dialog" 3 10 13 0 0 

Parametry jsou opět podobné, pouze poslední tři označují přednastavený čas.

Menu

V posledním z jednoduchých příkladů se pokusíme vytvořit menu pro výběr distribuce.

dialog --menu "Výběr distribuce" 20 100 75 OpenSUSE "Pro začátečníky" Ubuntu "Pro začátečníky" Archlinux "Pro pokročilé" Gentoo "Pro pokročilé" 

Při vytváření se hledá na páry položek, kde první je název a druhá popis. V tomto konkrétním případě Dialog vrátí název vybrané distribuce na zvolený výstup.

Další parametry

Pro vytvoření složitějšího dialogu budeme potřebovat ještě několik parametrů, které použijeme na vytvoření kombinovaného dialogu. Těmi jsou:

--clear        Vymaže předchozí dialog
--and-widget   Přidá další dialog
--begin        Označuje začátek umístění dalšího dialogu 

Největší silou Dialogu je možnost vložit do jednoho „sezení“ více dialogů najednou. Jednoduchý příklad by mohl vypadat takto:

Bez zmizení:

dialog --begin 5 5 --msgbox "Informační boxík 1" 5 10 \
    --and-widget --begin 7 7 --msgbox "Informační boxík 2" 5 10

Se zmizením:

dialog --begin 5 5 --clear --msgbox "Informační boxík 1" 5 10 \
    --and-widget --begin 5 5 --msgbox "Informační boxík 2" 5 10 

K tomu slouží parametry –clear a –and-widget. První jmenovaný vymaže předchozí zobrazený widget a druhý přidá další na zvolenou pozici. Máme také možnost říci Dialogu, kam chceme nový dialog umístit za pomocí parametru –begin.

Složitější dialog – získání údajů o uživateli

Nebudeme chodit kolem horké kaše a skočíme rovnou doprostřed:

dialog --output-fd 3 --begin 5 5 --clear --msgbox "Informace o uživateli" 5 40 \
--and-widget --begin 5 5 --form "Formulář" 30 80 50 \
      "Jméno" 1 1 "" 1 20 30 25 \
      "Příjmení" 3 1 "" 3 20 30 25 \
      "Telefon" 5 1 "" 5 20 30 25 \
      "Email" 7 1 "" 7 20 30 25 \
      "Web" 9 1 "" 9 20 30 25 \
--and-widget --begin 7 7 --menu "Výběr distribuce" 20 100 75 \
      OpenSUSE "Pro začátečníky" \
      Ubuntu "Pro začátečníky" \
      Archlinux "Pro pokročilé" \
      Gentoo "Pro pokročilé" \
3> /tmp/out 

Tento příklad zobrazí tři dialogy, kde první informuje o úmyslu zbylých dvou. Pak pomocí –and-widget přidáme další, kde je použit –form pro vytvoření formuláře, který se zeptá uživatele na informace o něm. Krom nám známých parametrů se zmíním o –begin, za kterým následuje pozice nového dialogu, a o položkách ve –form. První parametr položky je název, další dva označují polohu tohoto názvu, v dalším najdeme předvyplněné hodnoty pro položku a za ní jsou dva parametry označující polohu políčka pro vyplnění údaje. Poslední dva označují velikost políčka a maximální délku řetězce v něm. Pro zpracování výstupu jsme zvolili file descriptor s číslem tři a přesměrovali ho do /tmp/out.

Dialog

Závěr

Vývoj na programu Dialog je opravdu znát. Využívá ho řada distribucí pro instalaci balíčků a konfiguraci systému. Svoje místo místo si najde prakticky všude, kde se aspoň trochu myslí na uživatele, kteří používají příkazovou řádku. Použití není složité, takže není problém si pomocí Dialogu vytvořit vlastní konfigurační nástroje i jiné věci.

Anketa

Preferujete více grafické nebo textové dialogy?

Našli jste v článku chybu?

3. 11. 2008 11:38

Biktop (neregistrovaný)
že otázka nestojí jestli "je lepší dialog textový nebo grafický nebo vůbec žádný a raději dávkový přístup", ale že každý přístup má svoje výhody a nevýhody a v různých problémech se prostě projevují různé aspekty toho či onoho a tedy co je výhodné u problému X nemusí být výhodné u problému Y? Uživatelské rozhraní je příliš komplexní věc, než aby se dalo redukovat na otázku "je lepší dělat GUI nebo CLI" či "je lepší dělat dialogy takové nebo makové". Redukcí na jedno…
120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?