Úvodník
V dnešním pokračování seriálu o programovacím prostředí Tcl/Tk si popíšeme použití příkazu tk_dialog určeného pro tvorbu dialogových oken. Také si ukážeme práci se standardními dialogovými okny dostupnými pomocí příkazů tk_messageBox, tk_getOpenFile, tk_getSaveFile a tk_chooseColor.
Obsah
1. Použití příkazu tk_dialog
2. Standardní dialogová okna
3. Dialogové okno pro otevření souboru
4. Příklad využívající dialogové okno pro otevření souboru
5. Dialogové okno pro uložení souboru
6. Příklad využívající dialogové okno pro uložení souboru
7. Dialogové okno pro výběr barvy
8. Příklad využívající dialogové okno pro výběr barvy
9. Obsah dalšího pokračování tohoto seriálu
1. Použití příkazu tk_dialog
V předchozí části tohoto seriálu jsme si stručně popsali použití příkazu tk_dialog, který slouží k vyvolání dialogového okna s přednastaveným textem a příkazovými tlačítky. Dnes si blíže ukážeme strukturu tohoto příkazu. Příkaz tk_dialog při svém zavolání vyžaduje několik parametrů. Obecný vzor je možné zapsat následovně:
tk_dialog window title text bitmap default string string ...
kde je v parametru window předáno jméno okna, které bude pro zobrazení dialogu použito. Okno s tímto názvem bude před zobrazením dialogu zrušeno, to znamená, že pokud nechceme zrušit žádné z existujících oken, je do tohoto parametru nutné zapsat jméno nového (neexistujícího) okna. Dále následuje parametr title, kterým se specifikuje titulek dialogového okna, popř. i text u ikony, pokud je dialog minimalizován (mnoho správců oken však neumožňuje minimalizaci dialogů). V parametru text je uveden text, který je v dialogu zobrazen. V následujícím parametru bitmap se předává název bitmapy (jednobarevného rastrového obrazu), která může být zobrazena nalevo od textu. V případě, že žádnou bitmapu nepotřebujeme zobrazit, je nutné do tohoto parametru zadat prázdný řetězec, tj. dvojici uvozovek. Dále následuje parametr default, v němž je předán index tlačítka, které má při zobrazení dialogu přiřazen fokus. Po tomto parametru (který je jako poslední povinný) již následuje libovolný počet řetězců, kde každý řetězec reprezentuje jedno příkazové tlačítko zobrazené v dialogu. Po výběru nějakého tlačítka se vrátí index stisknutého tlačítka, číslování přitom začíná od nuly. Příklad použití příkazu tk_dialog je velmi jednoduchý:
#!/usr/bin/wish
# Použití dialogových oken
# První demonstrační příklad
# Vytvoření všech tlačítek v hlavním okně aplikace
button .dialog -text "Konfigurace serveru" -command {zobrazDialog}
button .quit -text "Konec" -command {exit}
pack .dialog
pack .quit -fill both
proc zobrazDialog {} {
tk_dialog .dialog1 "Konfigurace serveru" "Preformatovat systemovy pevny disk?" "" 0 "Ano" "Ne"
}
# finito

Obrázek 1: Screenshot prvního demonstračního příkladu s dialogem na X Window systému

Obrázek 2: Screenshot prvního demonstračního příkladu s dialogem na Windows XP
V předchozím příkladu jsme nepoužili žádnou bitmapu, protože v příslušném parametru příkazu tk_dialog byl předán prázdný řetězec – "". Kromě uživatelsky definovaných bitmap je možné použít i vestavěné bitmapy, jejichž seznam je uveden v následující tabulce. Musím však přiznat, že zobrazování bitmap v dialozích považuji za přežitek z dávných dob, kdy byla většina pracovních stanic i terminálů vybavena monochromatickými monitory. Dnes by již bylo vhodnější povolit i používání pixmap, tj. v pojetí Tcl/Tk objektů typu „image photo“.
Jméno | Význam |
---|---|
info | Znak „i“ symbolizující informaci |
question | Znak otazníku |
warning | Znak vykřičníku |
error | Označení chyby – přeškrtnuté kolečko |
questhead | Hlava s otazníkem |
hourglass | Přesýpací hodiny |
gray12 | Ditherovaný obdélník s 12% šedi |
gray25 | Ditherovaný obdélník s 25% šedi |
gray50 | Ditherovaný obdélník s 50% šedi |
gray75 | Ditherovaný obdélník s 75% šedi |
Dialog zobrazený v předchozím demonstračním příkladu je tedy možné rozšířit o bitmapu:
#!/usr/bin/wish
# Použití dialogových oken
# Druhý demonstrační příklad
# Vytvoření všech tlačítek v hlavním okně aplikace
button .dialog -text "Konfigurace serveru" -command {zobrazDialog}
button .quit -text "Konec" -command {exit}
pack .dialog
pack .quit -fill both
proc zobrazDialog {} {
tk_dialog .dialog1 "Konfigurace serveru" "Preformatovat systemovy pevny disk?" question 0 "Ano" "Ne"
}
# finito

Obrázek 3: Screenshot druhého demonstračního příkladu s dialogem na X Window systému

Obrázek 4: Screenshot druhého demonstračního příkladu s dialogem na Windows XP
2. Standardní dialogová okna
Kromě příkazu tk_dialog je k dispozici ještě příkaztk_messageBox, který sice není tak obecný, zato poskytuje aplikacím možnost zobrazovat systémová dialogová okna, která plně odpovídají konvencím daného operačního systému a jeho GUI. Formát příkazu tk_messageBox je následující:
tk_messageBox ?option value ...?
Jak je z předchozího zápisu patrné, je předávání parametrů řešeno volněji než v případě příkazu tk_dialog. Mezi podporované parametry patří:
Volba | Význam |
---|---|
-title | Titulek dialogového okna, maximální délka je závislá na použitém GUI |
-message | Zpráva zobrazená v dialogovém oknu |
-icon | Ikona, která bude v dialogovém oknu zobrazena. Musí se jednat o jeden z názvů: error, info, question nebo warning |
-parent | Jméno rodičovského okna. Je zde použito proto, že dialog je vždy zobrazen před tímto oknem. |
-type | Typ dialogu, tj. počet a názvy zobrazených tlačítek. |
-default | Jméno tlačítka, které bude při zobrazení vlastnit fokus. |
Parametr type, kterým se specifikuje počet a názvy zobrazených tlačítek, může nabývat hodnot:
Hodnota parametru type | Tlačítka |
---|---|
ok | Ok |
okcancel | Ok a Cancel |
retrycancel | Retry a Cancel |
yesno | Yes a No |
yesnocancel | Yes, No a Cancel |
abortretryignore | Abort, Retry a Ignore |
Všimněte si, že není podporováno tlačítko Help, které může být ve standardních dialogových boxech přítomno. Příklad na použití příkazu tk_messageBox je poněkud složitější, protože ukazuje použití všech typů dialogů. Také si všimněte, že v některých systémech (resp. v jejich grafických uživatelských rozhraních) jsou texty na dialogových tlačítkách lokalizovány, což způsobuje problémy při práci s nelokalizovanými aplikacemi (problém způsobuje špatná práce systémů s identifikací jazyka aplikace).
#!/usr/bin/wish
# Použití dialogových oken
# Třetí demonstrační příklad
# jména příkazových tlačítek
set buttons {
.info
.error
.question
.warning
.ok
.okcancel
.retrycancel
.yesno
.yesnocancel
.abortretryignore
.exit
}
# popisky příkazových tlačítek
set texts {
Info
Error
Question
Warning
Ok
"Ok Cancel"
"Retry Cancel"
"Yes No"
"Yes No Cancel"
"Abort Retry Ignore"
Exit
}
# jména volaných procedur
set commands {
info_box
error_box
question_box
warning_box
ok_box
okcancel_box
retrycancel_box
yesno_box
yesnocancel_box
abort_box
exit
}
# zobrazení všech příkazových tlačítek v okně
foreach button $buttons text $texts command $commands {
button $button -text $text -command $command
pack $button -fill both
}
proc info_box {} {
tk_messageBox -title "Info message box" -message "Message box with info icon" -icon info
}
proc error_box {} {
tk_messageBox -title "Error message box" -message "Message box with error icon" -icon error
}
proc question_box {} {
tk_messageBox -title "Question message box" -message "Message box with question icon" -icon question
}
proc warning_box {} {
tk_messageBox -title "Warning message box" -message "Message box with warning icon" -icon warning
}
proc ok_box {} {
tk_messageBox -title "Info message box" -message "Buttons: Ok" -icon info -type ok
}
proc okcancel_box {} {
tk_messageBox -title "Info message box" -message "Buttons: Ok and Cancel" -icon info -type okcancel
}
proc retrycancel_box {} {
tk_messageBox -title "Info message box" -message "Buttons: Retry and Cancel" -icon info -type retrycancel
}
proc yesno_box {} {
tk_messageBox -title "Info message box" -message "Buttons: Yes and No" -icon info -type yesno
}
proc yesnocancel_box {} {
tk_messageBox -title "Info message box" -message "Buttons: Yes, No and Cancel" -icon info -type yesnocancel
}
proc abort_box {} {
tk_messageBox -title "Info message box" -message "Buttons: Abort, Retry and Ignore" -icon info -type abortretryignore
}
# finito

Obrázek 5: Screenshot třetího demonstračního příkladu s dialogem na X Window systému

Obrázek 6: Screenshot třetího demonstračního příkladu s dialogem na Windows XP
3. Dialogové okno pro otevření souboru
Otevření či načtení souboru patří mezi často používané operace, proto má mnoho systémů s GUI zabudovaný dialog pro výběr jména souboru. Pomocí Tcl/Tk je možné k tomuto dialogu přistupovat. Potřebný příkaz se jmenuje tk_getOpenFile a syntaxe jeho vyvolání je následující:
tk_getOpenFile ?option value ...?
Parametry příkazu tk_getOpenFile jsou souhrnně uvedeny v tabulce.
Parametr | Význam |
---|---|
-defaultextension | Řetězec, který je ke jménu souboru přidán v případě, že soubor nemá koncovku. Nepoužívá se na platformě Mac OS. |
-filetypes | Seznam typů souborů, které mohou být vybrány. Kvůli kompatibilitě s Mac OS je nutné kromě koncovky zadat i typ souboru dle MacOS. |
-initialdir | Adresář, jehož obsah je při zobrazení vypsán. Pokud není žádný adresář zadán, použije se pracovní adresář. |
-initialfile | Jméno souboru, který je po zobrazení dialogu vybrán. Většinou se zde nachází prázdný řetězec. |
-multiple | Povolení výběru více souborů. Způsob výběru souborů je systémově závislý, typicky se používá levé tlačítko myši spolu s klávesou Shift a/nebo Ctrl. |
-message | Text zprávy, která může být v dialogu zobrazena. Používá se pouze na Mac OS. |
-parent | Rodičovské okno. To může být specifikováno proto, aby se zaručilo, že je dialog zobrazen vždy nad tímto oknem. |
-title | Titulek dialogového okna. |
Po výběru souboru se jeho jméno vrátí jako návratová hodnota příkazu tk_getOpenFile. Pokud není žádný soubor vybrán, vrátí se prázdný řetězec. V případě, že je pomocí volby -multiple povolen výběr více souborů, jsou v návratové hodnotě obsaženy všechny vybrané soubory. Při programování přenositelných aplikací je zapotřebí dát pozor na fakt, že v každém systému je použita jiná konvence pro pojmenování datových zařízení a oddělování jednotlivých adresářů a souborů. OS Windows v nových verzích sice jako oddělovače akceptují i normální lomítka, ale z dialogu pro otevření souboru se vrací jméno se zpětnými lomítky.
4. Příklad využívající dialogové okno pro otevření souboru
Zde uvedený příklad zobrazí dialogový box pro výběr souboru. Přitom jsou nastaveny povolené typy souborů tak, aby byl program do co největší míry přenositelný na různé platformy, tj. unixové operační systémy, Microsoft Windows i Mac OS. Z tohoto důvodu jsou pro typy souborů použity jak klasické koncovky (.gif), tak i „macovsky“ pojmenované typy, například GIFF. Po získání jména souboru se toto jméno uloží do lokální proměnné filename a obsah této proměnné je zobrazen pomocí příkazu tk_messageBox.
#!/usr/bin/wish
# Použití dialogových oken
# Čtvrtý demonstrační příklad
# Vytvoření všech tlačítek v hlavním okně aplikace
button .open -text "Otevreni souboru" -command {openFile}
button .quit -text "Konec" -command {exit}
pack .open -fill both
pack .quit -fill both
proc openFile {} {
set types {
{{Text Files} {.txt} }
{{TCL Scripts} {.tcl} }
{{C Source Files} {.c} TEXT}
{{GIF Files} {.gif} }
{{GIF Files} {} GIFF}
{{All Files} * }
}
set filename [tk_getOpenFile -filetypes $types]
tk_messageBox -title "Vyber souboru" -message "Byl vybran soubor $filename" -icon info -type ok
}
# finito
Obrázek 7: Screenshot čtvrtého demonstračního příkladu s dialogem na X Window systému
Obrázek 8: Screenshot čtvrtého demonstračního příkladu s dialogem na Windows XP
5. Dialogové okno pro uložení souboru
Dialogové okno určené pro uložení souboru se v mnohém podobá dialogovému oknu pro jeho otevření. Jediný rozdíl spočívá v odlišném popisu příkazových tlačítek v dialogovém oknu, odlišném titulku (pokud není zadán programově) a také v tom, že soubor, který je určen pro zápis, nemusí existovat – při otevírání souboru probíhají kontroly na jeho existenci. V následující kapitole je ukázáno, jakým způsobem je možné vytvořit dialogové okno, které uživateli umožní výběr textového souboru pro zápis. Všimněte si, že při specifikaci typu souboru pomocí volby -filetypes je nutné použít dvojité složené závorky. Je to z toho důvodu, že volba -filetypes jako svůj argument akceptuje seznam podseznamů, kde každý podseznam obsahuje postupně popis typu souboru, koncovku (pro systémy Unix a Microsoft Windows) a typ souboru zaregistrovaný v Mac OS.
6. Příklad využívající dialogové okno pro uložení souboru
#!/usr/bin/wish
# Použití dialogových oken
# Pátý demonstrační příklad
# Vytvoření všech tlačítek v hlavním okně aplikace
button .save -text "Ulozeni souboru" -command {openFile}
button .quit -text "Konec" -command {exit}
pack .save -fill both
pack .quit -fill both
proc openFile {} {
set filename [tk_getSaveFile -filetypes {{"Textove soubory" "*.txt" TEXT}}]
tk_messageBox -title "Vyber souboru" -message "Byl vybran soubor $filename" -icon info -type ok
}
# finito
Obrázek 9: Screenshot pátého demonstračního příkladu s dialogem na X Window systému
Obrázek 10: Screenshot pátého demonstračního příkladu s dialogem na Windows XP
7. Dialogové okno pro výběr barvy
Také pro výběr barvy je možné použít standardní systémové okno. Způsob zobrazení okna je, podobně jako při otevírání i ukládání souborů, závislý na použitém operačním systému a jeho grafickém uživatelském rozhraní. Ukázka zobrazení na Linuxu a Windows XP je uvedena v následující kapitole.
8. Příklad využívající dialogové okno pro výběr barvy
#!/usr/bin/wish
# Použití dialogových oken
# Šestý demonstrační příklad
# Vytvoření všech tlačítek v hlavním okně aplikace
button .color -text "Vyber barvy" -command {chooseColor}
button .quit -text "Konec" -command {exit}
pack .color -fill both
pack .quit -fill both
proc chooseColor {} {
tk_chooseColor -title "Vyber barvy" -initialcolor "#00ff00"
}
# finito
Obrázek 11: Screenshot šestého demonstračního příkladu s dialogem na X Window systému
Obrázek 12: Screenshot šestého demonstračního příkladu s dialogem na Windows XP
9. Obsah dalšího pokračování tohoto seriálu
V dalším pokračování dokončíme část věnovanou toolkitu Tk. Povíme si bližší informace o správci oken, práci s fonty a také si popíšeme některá rozšíření toolkitu Tk.