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.
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 |
extfileselectiondialog | 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ří:
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 vstupu |
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.
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.
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 vstupu |
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
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
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
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
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
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
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
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,minuteRadius, 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
Obrázek 9: Screenshot devátého demonstračního příkladu
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ů.