Programovací jazyk TCL (18)

15. 11. 2005
Doba čtení: 8 minut

Sdílet

Dnešní část seriálu o programovacím jazyku Tcl bude zaměřena na popis knihovny IWidgets, která, podobně jako minule popsaná knihovna BWidgets, slouží k rozšíření původního toolkitu Tk o další widgety a jejich funkcionalitu.

Obsah

1. Úvodní informace o knihovně IWidgets
2. Práce s kalendářem – widget datefield
3. Widget dateentry
4. Widget calendar
5. Widget spindate
6. Zobrazení a nastavení času – widget timefield
7. Widget timeentry
8. Widget watch
9. Obsah dalšího pokračování tohoto seriálu

1. Úvodní informace o knihovně IWidgets

Knihovna IWidgets v mnoha směrech rozšiřuje možnosti původního toolkitu Tk. Je obohacena jak množina dostupných widgetů (GUI prvků), tak i pomocné modální a nemodální dialogy. Nové widgety z této knihovny jsou mnohdy velmi složité – jedná se například o plně funkční kalendář, kreslicí plátno rozšířené o možnosti posuvu a změnu měřítka, plochu zobrazující libovolnou HTML stránku aj. Jména všech widgetů a dialogů dostupných z knihovny IWidgets (verze 4 a vyšší) jsou vypsána v následující tabulce. V dalším textu si popíšeme funkcionalitu pouze vybrané podskupiny objektů, další skupinu si popíšeme v devatenáctém pokračování tohoto seriálu.

GUI objekty poskytované knihovnou IWidgets
buttonbox fileselectiondialog scrolledcanvas
calendar finddialog scrolledframe
canvasprintbox hierarchy scrolledhtml
canvasprintdialog hyperhelp scrolledlistbox
checkbox labeledframe scrolledtext
combobox labeledwidget selectionbox
dateentry mainwindow selectiondialog
datefield menubar shell
dialog messagebox spindate
dialogshell messagedialog spinint
disjointlistbox notebook spinner
entryfield optionmenu spintime
extbutton panedwindow tabnotebook
extfileselectionbox promptdialog tabset
extfileselecti­ondialog pushbutton timeentry
feedback radiobox timefield
fileselectionbox scopedobject toolbar
watch

2. Práce s kalendářem – widget datefield

Při zadávání data či zobrazování kalendáře mnohdy nevystačíme se základními widgety poskytovanými toolkitem Tk. Vstupy od uživatele je totiž zapotřebí ihned po zadání validovat a výstupy naopak zobrazovat v co nejpříjemnější a nejsrozumitelnější formě. V knihovně IWidgets jsou pro tuto činnost určeny hned čtyři widgety, které jsou popsány v této a následujících třech kapitolách.

Prvním widgetem určeným pro vstup i výstup dat je widget nazvaný datefield, který je tvořen polem se zobrazeným datem a popř. i popisem (jmenovkou). Tento widget je možné vytvořit příkazem datefield jméno parametry. Mezi podporované parametry patří:

Parametry widgetu datefield
Jméno parametru Význam
command příkaz provedený po stlačení klávesy Enter (Return) ve widgetu
gmt určuje, zda se má pracovat s datem ve formátu GMT
int specifikuje formát zobrazení: YYYY-MM-DD nebo MM/DD/YYYY
iq nastavuje „inteligenci“ widgetu při kontrole uživatelského vstu­pu
labeltext text zobrazený ve jmenovce
state povoluje či zakazuje uživatelský vstup (zadání data)

Demonstrační příklad je velmi jednoduchý, protože se pouze zobrazí widget datefield s popiskou, do kterého je možné zadat libovolné (platné) datum:

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# První demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

# procedura volaná při změně hodnoty na widgetu
proc vstup {} {
    # tisk nastavené hodnoty
    puts [.df get]
}

# vytvoření widgetu pro práci s datem
iwidgets::datefield .df -labeltext "Datum:" -command vstup -int 1

# vložení widgetu do okna
pack .df

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 

Při testování příkladu si také všimněte, že při zadávání údajů je možné použít kurzorová tlačítka „nahoru“ a „dolů“ pro posun o jeden den vpřed či vzad. Při změně roku či měsíce dochází ke kontrole (a případné automatické změně) zadaného dnu, takže se například nestane, že by se do programu vrátilo datum 31. 2. 2005.

TCL 18 - 1

Obrázek 1: Screenshot prvního demonstračního příkladu

3. Widget dateentry

Podobným widgetem, jakým je datefield, je widget nazvaný dateentry. Kromě zobrazení pole pro vstup i výstup údajů je zobrazeno i příkazové tlačítko, po jehož stisknutí se zobrazí plnohodnotný kalendář. Widget dateentry je totiž ve skutečnosti složen z widgetů datefield a calendar (ve smyslu OOP dědí své vlastnosti z datefieldu). Tento widget se vytvoří pomocí příkazu dateentry jméno parametry, podporované parametry jsou vypsány v níže uvedené tabulce.

Parametry widgetu dateentry
Jméno parametru Význam
command příkaz provedený po stlačení klávesy Enter ve widgetu
gmt určuje, zda se má pracovat s datem ve formátu GMT
int specifikuje formát zobrazení: YYYY-MM-DD nebo MM/DD/YYYY
iq nastavuje „inteligenci“ widgetu při kontrole uživatelského vstu­pu
labeltext text zobrazený ve jmenovce
state povoluje či zakazuje uživatelský vstup (zadání data)
icon ikona, která bude zobrazena na příkazovém tlačítku vyvolávajícím kalendář

Po spuštění druhého demonstračního příkladu se zobrazí widget dateentry pomocí své jmenovky, textového pole pro vstup a příkazového tlačítka pro zobrazení kalendáře.

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# Druhý demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

# procedura volaná při změně hodnoty na widgetu
proc vstup {} {
    # tisk nastavené hodnoty
    puts [.de get]
}

# vytvoření widgetu pro práci s datem
iwidgets::dateentry .de -labeltext "Datum:" -command vstup -int 1

# vložení widgetu do okna
pack .de

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 
TCL 18 - 2

Obrázek 2: Screenshot druhého demonstračního příkladu

4. Widget calendar

Widget calendar je určen pro přehledné zobrazení všech dnů v jednom měsíci. Kromě toho je na widgetu zobrazena dvojice přetáčecích tlačítek, pomocí kterých se přeskakuje mezi jednotlivými měsíci v roce (popř. i mezi roky). Dny jsou zobrazeny podobně jako v „papírovém“ kalendáři, tj. zarovnané do jednotlivých týdnů s barevně zvýrazněným rozdílem mezi pracovními dny a svátky (ten je však nutné programově nastavit). Vzhledem k tomu, že v různých zemích se mohou lišit dny, jimiž týdny začínají (většinou je to pondělí či neděle), je možné pomocí volby startday tento den nastavit. Pomocí dalších voleb je možné specifikovat barvy pozadí a popředí políček se dny a také názvy jednotlivých dnů (pokud nevyhovuje standardně nastavená angličtina). Třetí demonstrační příklad ukazuje nejjednodušší použití widgetucalendar:

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# Třetí demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

iwidgets::calendar .cal

# vložení widgetu do okna
pack .cal

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 
TCL 18 - 3

Obrázek 3: Screenshot třetího demonstračního příkladu

Ve čtvrtém demonstračním příkladu je ukázána konfigurace widgetu calendar pomocí několika voleb. Nejprve se pomocí příkazu option nastaví konfigurace pro všechny vytvářené widgety daného typu. Z těchto voleb je patrné, jakým způsobem lze barevně odlišit pracovní dny a svátky. Volba -startday monday zajistí posun dnů ve sloupcích tak, aby začínaly pondělím a volba -days {Po Út St Čt Pá So Ne} přejmenuje názvy sloupců.

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# Čtvrtý demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

# konfigurace widgetů typu calendar
option add *Calendar.buttonForeground black
option add *Calendar.outline black
option add *Calendar.weekdayBackground white
option add *Calendar.weekendBackground mistyrose
option add *Calendar.selectColor red

# vytvoření widgetu s kalendářem
iwidgets::calendar .cal -startday monday -days {Po Út St Čt Pá So Ne}

# vložení widgetu do okna
pack .cal

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 
TCL 18 - 4

Obrázek 4: Screenshot čtvrtého demonstračního příkladu

5. Widget spindate

Widget nazvaný spindate slouží, podobně jako výše popsané widgety, pro uživatelské zadání data. Celý widget se ve své podstatě skládá ze tří textových polí s přidruženými přetáčecími (spin) tlačítky. V základní konfiguraci se do prvního textového pole zadává měsíc, do druhého pole den a do pole třetího rok. Uživatel může datum měnit buď pomocí klávesnice (přepis hodnot), nebo pomocí myši (přetáčecí tlačítka). Widget sám kontroluje, zda je zadané datum korektní a automaticky opravuje nesmyslné hodnoty (omezení počtu dní v měsíci). Použití tohoto widgetu je patrné z pátého demonstračního příkladu:

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# Pátý demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

iwidgets::spindate .date

# vložení widgetu do okna
pack .date

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 
TCL 18 - 5

Obrázek 5: Screenshot pátého demonstračního příkladu

Na šestém demonstračním příkladu je ukázána změna některých vlastností widgetu spindate. Nejprve jsou modifikovány popisy jednotlivých vstupních polí. Posléze je volbou -orient zadána horizontální orientace jednotlivých polí – výchozí je orientace vertikální.

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# Šestý demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

# konfigurace widgetů typu spindate
option add *Spindate.dayLabel Den
option add *Spindate.monthLabel Měsíc
option add *Spindate.yearLabel Rok

# vytvoření widgetu pro práci s datem
iwidgets::spindate .date -orient horizontal

# vložení widgetu do okna
pack .date

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 
TCL 18 - 6

Obrázek 6: Screenshot šestého demonstračního příkladu

6. Zobrazení a nastavení času – widget timefield

Práce s časovými údaji je v mnohém podobná práci s datem. Obdobou widgetu datefield je widget timefield (zobrazení a vstup časových údajů), jehož použití je ukázáno na sedmém demonstračním příkladu. V tomto příkladu je také ukázána reakce na změnu časového údaje.

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# Sedmý demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

# procedura zavolaná při změně času
proc vstup {} {
    # tisk nastavené hodnoty
    puts [.tf get]
}

# vytvoření widgetu pro zadání časového údaje
iwidgets::timefield .tf -labeltext "Čas:" -command vstup

# vložení widgetu do okna
pack .tf

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 
TCL 18 - 7

Obrázek 7: Screenshot sedmého demonstračního příkladu

7. Widget timeentry

Widget timeentry se v mnohém podobá widgetudateentry, ale s tím rozdílem, že se po stisknutí příkazového tlačítka (nyní ale s ikonou hodin) nezobrazí kalendář, ale „vkusně“ vykreslené analogové hodiny, s jejichž ručičkami je možné pomocí kurzoru myši pohybovat (horší je snad jen rádoby 3D číselník ve Windows XP). Ovládání pomocí klávesnice není možné, už z toho důvodu, že ciferník nemůže získat fokus. Vše je možné vyzkoušet v osmém demonstračním příkladu:

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# Osmý demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

# procedura zavolaná při změně času
proc vstup {} {
    # tisk nastavené hodnoty
    puts [.te get]
}

# vytvoření widgetu pro zadání časového údaje
iwidgets::timeentry .te -labeltext "Čas:" -command vstup

# vložení widgetu do okna
pack .te

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 
TCL 18 - 8

Obrázek 8: Screenshot osmého demonstračního příkladu

8. Widget watch

Widget nazvaný příznačně watch slouží k zobrazení „analogových“ hodin, tj. ciferníku s hodinovou, minutovou a sekundovou ručičkou a případně i přepínačem mezi dopoledním a odpoledním časem. Pomocí voleb clockColor, hourColor, minuteColor a secondColor se mění barvy jednotlivých částí hodin. Dále je možné měnit poloměry kružnic, po nichž se pohybují konce ručiček, volbami hourRadius,mi­nuteRadius, secondRadius a pivotRadius.

#!/usr/bin/wish

# Práce s knihovnou IWidgets
# Devátý demonstrační příklad

# načtení knihovny IWidgets
package require Iwidgets 4.0

# vytvoření widgetu s analogovými hodinami
iwidgets::watch .ww

# vložení widgetu do okna
pack .ww

# tlačítko pro ukončení aplikace
pack [button .q -command {exit} -text "Konec"]

# finito 
TCL 18 - 9

Obrázek 9: Screenshot devátého demonstračního příkladu

bitcoin_skoleni

9. Obsah dalšího pokračování tohoto seriálu

V dalším pokračování tohoto seriálu dokončíme popis knihovny IWidgets. Ukážeme si použití widgetu zobrazujícího HTML stránky (což je použitelné i pro vytváření nápovědy), rozšířeného kreslicího plátna s možností tisku a změny měřítka, widgetu pro výběr souboru a konečně widgetu určeného pro přesuny položek mezi dvojicí seznamů.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.