Programovací jazyk TCL (14)

18. 10. 2005
Doba čtení: 10 minut

Sdílet

Ilustrační obrázek
Autor: Depositphotos – stori
Ilustrační obrázek
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.

Ú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

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 
TCL 14 - 1

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

TCL 14 - 2

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“.

Bitmapy připravené pro použití v dialogových boxech
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 
TCL 14 - 3

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

TCL 14 - 4

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_messa­geBox, 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ří:

Parametry příkazu tk_messageBox
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:

Hodnoty parametru type
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 
TCL 14 - 5

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

TCL 14 - 6

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.

Parametry příkazu tk_getOpenFile
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 
TCL 14 - 7

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

TCL 14 - 8

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 
TCL 14 - 9

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

TCL 14 - 10

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 
TCL 14 - 11

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

TCL 14 - 12

Obrázek 12: Screenshot šestého demonstračního příkladu s dialogem na Windows XP

linux_sprava_tip

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.

Autor článku

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