Hlavní navigace

Programovací jazyk TCL (16)

1. 11. 2005
Doba čtení: 7 minut

Sdílet

V šestnácté části seriálu o programovacím jazyku Tcl si ukážeme práci s knihovnami BWidgets a IWidgets, které slouží, podobně jako dříve popisovaný toolkit Tk, k tvorbě grafického uživatelského rozhraní.

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:

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) šip­kou
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.

Složené widgety dostupné z knihovny BWidgets
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.

Kontejnery a řídicí widgety dostupné z knihovny BWidgets
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

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

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.

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

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

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

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

CS24_early

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.

Byl pro vás článek přínosný?

Autor článku

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