Obsah
1. Základní informace o knihovně BWidgets
2. Objekty GUI poskytované knihovnou BWidgets
3. Demonstrační příklady využívající knihovnu BWidgets
4. Základní informace o knihovně IWidgets
5. Objekty GUI poskytované knihovnou IWidgets
6. Demonstrační příklady využívající knihovnu IWidgets
7. Obsah dalšího pokračování tohoto seriálu
1. Základní informace o knihovně BWidgets
V předchozích částech tohoto seriálu jsme si popsali základy programování ve skriptovacím programovacím jazyku Tcl (části I až IV). Také jsme si ukázali nejdůležitější widgety dostupné z knihovny widgetů (toolkitu) Tk (části V-XV). Pomocí tohoto velmi jednoduše použitelného toolkitu je možné vytvářet poměrně sofistikované grafické uživatelské rozhraní. Díky tomu se dvojice nástrojů Tcl/Tk stala v unixovém světě značně oblíbeným prostředkem pro tvorbu GUI, protože představovala velmi dobrou alternativu k tehdejšímu (komerčně dostupnému) Motifu. Dnes je situace odlišná, protože máme k dispozici i knihovny GTK a Qt, které zdařile konkurují právěMotifu. S větším rozšířením toolkitu Tk se však ukazovaly i některé jeho nedostatky, zvláště chyběla podpora pro další typy složitějších widgetů, například pro tvorbu toolbarů a zobrazení stromové struktury dat.
Na tyto nedostatky postupně reagovali vývojáři vytvořením knihoven BWidgets a IWidgets. Obě zmíněné knihovny rozšiřují původní toolkit Tk ve dvou směrech. V prvním směru to je úprava původní sady widgetů tak, aby se znásobily jejich schopnosti (například se jedná o reakci na tažení myší či zobrazení kontextové nápovědy), ve druhém směru se jedná o vytvoření zcela nových widgetů, které v Tk nebyly z různých důvodů obsaženy. Současně se však do značné míry dodržela filozofie Tcl/Tk: snadnost programování grafického uživatelského rozhraní, přenositelnost aplikací na různé platformy a rozšiřitelnost o další funkce. Jak knihovna BWidgets, tak iIWidgets přitom využívají objektového rozšíření Tcl, které se nazývá [incr Tcl]. Tento poněkud neobvyklý název vznikl jako napodobenina názvu jazyka C++: operátor ++ značí v C-čku, které je neobjektovým předchůdcem C++, inkrementaci, podobně jako funkce [incr ] v Tcl.
2. Objekty GUI poskytované knihovnou BWidgets
S využitím knihovny BWidgets je možné do aplikací přidat mnoho objektů grafického uživatelského rozhraní, které nebyly v původním toolkitu Tk přítomny. V prvé řadě se jedná o widgety, tj. aktivní a viditelné GUI objekty, dále jsou pak k dispozici různé složené widgety a kontejnery. Kromě toho jsou v této knihovně ve velké míře podporovány operace typu „drag and drop“ (táhni a pusť).
V následující tabulce jsou popsány widgety dostupné z knihovny BWidgets:
Název widgetu | Popis |
---|---|
Label | rozšíření původního widgetu label o další vlastnosti |
Entry | rozšíření původního widgetu entry o další vlastnosti |
Button | rozšíření původního widgetu button o další vlastnosti |
ArrowButton | příkazové tlačítko se zobrazenou (různě orientovanou) šipkou |
ProgressBar | widget zobrazující časový průběh dlouhotrvající operace |
ScrollView | rozšíření oken o možnost skrolování |
Separator | horizontální či vertikální úsečka s volitelným trojrozměrným vzhledem |
Další tabulka obsahuje soupis složených widgetů. Některé z těchto widgetů přitom mohou být zobrazeny jako samostatný dialog – jedná se o systémově závislou věc.
Název složeného widgetu | Popis |
---|---|
LabelEntry | widget entry uzavřený do rámečku s textem |
ComboBox | kombinace widgetu listbox a entry |
SpinBox | kombinace widgetu entry se skrolovacími tlačítky |
Tree | widget používaný pro zobrazení stromové struktury dat |
ListBox | rozšířený widget listbox |
MessageDlg | rozšířený dialogový box |
ProgressDlg | widget či dialogový box zobrazující průběh časově náročné operace |
PasswdDlg | widget či dialogový box určený pro zadání jména a hesla |
SelectFont | widget či dialogový box určený pro výběr fontu |
SelectColor | widget či dialogový box určený pro výběr barvy |
Ve třetí tabulce jsou uvedeny nové kontejnery a takzvané řídicí widgety. Tyto widgety jsou většinou umístěny v hlavním okně aplikace, které vhodným způsobem „dekorují“, tj. tvoří například toolbar či stavový řádek.
Název kontejneru či řídicího widgetu | Popis |
---|---|
MainFrame | okno s menu, toolbarem a stavovým řádkem |
LabelFrame | rámeček s textem |
TitleFrame | rámeček s titulkem |
PanelFrame | rámeček s jinak zobrazeným titulkem, který je možné použít jako toolbar |
ScrolledWindow | základ pro tvorbu dalších widgetů s možností skrolování |
ScrollableFrame | rámeček se skrolovacími prvky, do nějž je možné umístit další widgety |
PanedWindow | správce rozmístění, který mezi jednotlivé dlaždice umisťuje přetahovací prvky |
ButtonBox | sada horizontálně či vertikálně uspořádaných tlačítek |
PagesManager | správce stránek, na který je možné umisťovat další widgety |
NoteBook | podobné správci stránek, ale s rozšířenými možnostmi |
Dialog | obecné dialogové okno |
StatusBar | stavový řádek |
3. Demonstrační příklady využívající knihovnu BWidgets
Pro ilustraci možností knihovny BWidgets si ukážeme dva demonstrační příklady. Po spuštění prvního příkladu se zobrazí okno a v něm čtyři tlačítka se šipkami. Tato tlačítka jsou vytvořena pomocí widgetu ArrowButton, při jehož vytváření je možné specifikovat směr zobrazené šipky pomocí volby -dir. Pro zkrácení programu je použit průchod seznamy obsahujícími jak jména tlačítek, tak i jejich umístění v mřížce okna.
#!/usr/bin/wish
# Práce s knihovnou BWidget
# První demonstrační příklad
# Načtení knihovny BWidget
package require BWidget
# Vytvoření čtveřice tlačítek se šipkami
foreach button {top bottom left right} {
ArrowButton .$button -dir $button
}
# Rozmístění tlačítek se šipkami do okna
foreach button {top bottom left right} row {0 2 1 1} column {1 1 0 2} {
grid .$button -row $row -column $column
}
# finito
![TCL 16 - 1](https://i.iinfo.cz/urs/tcl16_1-113078244447466.png)
Obrázek 1: Screenshot prvního demonstračního příkladu
Ve druhém demonstračním příkladu je ukázáno, jakým způsobem je možné použít kontejner TitleFrame, tj. rámeček se zobrazeným titulkem. Všimněte si zejména, jakým způsobem je vyřešeno získání cesty, do které je možné vkládat další widgety (v našem případě jde o tlačítka pojmenovaná button1 a button2).
#!/usr/bin/wish
# Práce s knihovnou BWidget
# Druhý demonstrační příklad
# Načtení knihovny BWidget
package require BWidget
# Vytvoření rámečku s titulkem
TitleFrame .tf -relief sunken -text "Title frame"
# Získání cesty k rámečku
set fr [.tf getframe]
# Vytvoření tlačítek v rámečku
button $fr.button1 -text Button1 -width 20
button $fr.button2 -text Button2 -width 20
# Vložení tlačítek do rámečku a rámečku do okna
pack $fr.button1
pack $fr.button2
pack .tf
pack [button .quit -text Quit -command {exit}]
# finito
![TCL 16 - 2](https://i.iinfo.cz/urs/tcl16_2-113078246464869.png)
Obrázek 2: Screenshot druhého demonstračního příkladu
Další demonstrační příklady využívající knihovnu BWidgets budou uvedeny v následujícím pokračování tohoto seriálu.
4. Základní informace o knihovně IWidgets
Knihovna IWidgets je, podobně jako předchozí knihovna BWidgets, koncipována jako rozšíření původníku toolkitu tk o další widgety a dialogy. Tato knihovna obsahuje i velmi složité widgety, jakými jsou kalendář či plocha pro zobrazení HTML stránky.
5. Objekty GUI poskytované knihovnou IWidgets
V následující tabulce jsou vypsány všechny GUI objekty, které jsou poskytovány knihovnou IWidgets. Bližší informace o těchto objektech budou uvedeny v některém z dalších 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 |
6. Demonstrační příklady využívající knihovnu IWidgets
V následujícím demonstračním příkladu využívajícím knihovnu IWidgets je ukázáno použití velmi komplexního widgetu calendar. Všimněte si konfiguračních možností kalendáře, například možnosti nastavit do prvního sloupce libovolný den. V příkazu package require je kromě jména požadovaného balíčku uvedena i jeho verze. Jména všech dostupných balíčků je možné vypsat (či uložit do proměnné) příkazem package names.
#!/usr/bin/wish
# Práce s knihovnou IWidgets
# Třetí demonstrační příklad
# Načtení knihovny IWidgets
package require Iwidgets 4.0
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
. configure -background white
iwidgets::calendar .cal
pack .cal -expand yes -fill both
iwidgets::optionmenu .days -labeltext "Start Day:" -command {
set day [.days get]
.cal configure -startday $day -days $caldays($day)
}
pack .days -padx 4 -pady 4
array set caldays {
sunday {S M T W T F S}
monday {Mo Tu We Th Fr Sa Su}
}
.days insert end sunday monday
![TCL 16 - 3](https://i.iinfo.cz/urs/tcl16_3-113078256538085.png)
Obrázek 3: Screenshot třetího demonstračního příkladu
Další demonstrační příklad ukazuje, jakým způsobem je možné zobrazit text uložený v externím souboru ve formátu HTML. Použité renderovací jádro je poměrně jednoduché a nepodporuje například CSS, DOM ani skriptování pomocí Java Scriptu, ale pro zobrazení formátované nápovědy je použitý widget scrolledhtml více než dostačující. Vzhledem k tomu, že tento widget je založený na tkhtml, jsou podporovány hypertextové odkazy, zobrazování rastrových obrázků, tagy pro formátování textu atd. Kromě toho je možné naprogramovat reakci na výběr hypertextových odkazů a obrázků, čímž se možnosti původního hypertextu rozšiřují o možnosti interaktivního spojení s vyvíjenou aplikací.
#!/usr/bin/wish
# Práce s knihovnou IWidgets
# Čtvrtý demonstrační příklad
# Načtení knihovny IWidgets
package require Iwidgets 4.0
option add *textBackground seashell
iwidgets::scrolledhtml .sh -labeltext "Scrolledhtml" \
-width 5i -height 3i \
-wrap word -linkcommand ".sh import -link" -padx 10
pack .sh
# Načtení HTML stránky
.sh import tcl16.html
![TCL 16 - 4](https://i.iinfo.cz/urs/tcl16_4-113078260741808.png)
Obrázek 4: Screenshot čtvrtého demonstračního příkladu
7. Obsah dalšího pokračování tohoto seriálu
V dalším pokračování tohoto seriálu si uvedeme další příklady použití knihovny BWidgets.