Úvod do Tcl/Tk, časť 5 - alebo ako rýchlo programovať GUI (nielen) pod Linuxom

Po týždni sa pripomíname s ďalším objektom knižnice Tk, textom a demo aplikáciou využívajúcou viacero jeho vlastnos...


Po týždni sa pripomíname s ďalším objektom knižnice Tk, textom a demo
aplikáciou využívajúcou viacero jeho vlastností. Pozrime sa teda, čo to chceme
naprogramovať.
Ako vidno z obrázkov, je to pokus o akýsi textový prehliadač, použiteíný ako
help k aplikáciám a programom. To je aj pÖvodný účel, pre ktorý som ho napísal.
Nájdete ho ako súčasť jednoduchého grafického editora na
http://www.helpde.sk/dir.html.
Po úvodnej inicializácii zvolíme teraz pri písaní kódu trochu
"profesionálnejší" postup.
Celý program bude pozostávať len z procedúr, teda aj hlavnú časť zabalíme do
procedúry, ktorú na záver spustíme.
#!/usr/bin/wish -f
Začneme s hlavnou procedúrou, ktorá má za úlohu vytvoriť dizajn a vlastnosti
aplikácie.
proc Book {} { global wh source BrunixBook
set wh ".book.stred"
set BrunixBook "/BrunixBook"
Po deklarovaní globálnych premenných a ich úvodnom nastavení vytvoríme pomocou
nasledujúcich dvoch riadkov objekty obrázkov s daným menom. Parametrom file
zvolíme zdrojový obrázok uložený v príslušnom adresári. V prípade, že obrázky
budete mať uložené na inom mieste, musíte samozrejme zmeniť hodnotu premennej
BrunixBook.
image create photo "BookClose" -file $BrunixBook/books11.gif
image create photo "BookOpen" -file $BrunixBook/books10.gif
frame .book pack .book -expand yes -fill both frame .book.hore -bd 2 -relief
groove
frame .book.stred -bd 2 -relief groove
frame .book.dole -bd 2 -relief groove pack .book.hore .book.stred .book.dole
-expand yes -fill both
Vytvoríme základný rámec a rozčleníme ho ďalšími na plošné a logické celky.
label .book.hore.nad -text "BrunixBook" -font {-size 14}
pack .book.hore.nad
V hornej oblasti umiestnime nadpis a v strede nasledujúcim spÖsobom textbox s
posuvnou lištou. Ak si spomínate na predchádzajúcu časť seriálu, niečo podobné
sme robili s listboxom, takže podrobný popis previazania scrollbaru s iným
objektom už poznáme.
scrollbar $wh.ysc -relief groove -command "$wh.t yview"
text $wh.t -relief sunken -width 50 -height 18 -yscroll "$wh.ysc set" / -wrap
word
pack $wh.t $wh.ysc -side left -expand yes -fill both
Sústreďme sa teraz na objekt textboxu, ktorému sme vytvorili reliéf sunken,
nejakú dížku a šírku a parametrom wrap sme určili, že riadky sa majú zalamovať
po celých slovách a nie po znakoch. Widget text je velmi komplexný objekt, na
jeho popis by sme potrebovali možno dalšie dva články, záujemcom o podrobné
štúdium odporúčam pozrieť si manuálovú stránku (shell> man text).
Primárne je určený na neobmedzené vpisovanie textu, mÖžete ho použiť, ak sa
rozhodnete napísať vlastný textový editor. My ho však použijeme len ako akýsi
displej, teda budeme na ňom interaktívne zobrazovať text a obrázky. K tomu nám
dopomÖžu nasledujúce riadky, v ktorých využijeme zopár z mnohých pekných
vlastností Tcl/Tk. if {[winfo depth $wh.t] > 1} { set link "-foreground red
-relief flat -borderwidth 1" set normal "-relief flat -borderwidth 1
-foreground {}" } else { set link "-foreground {} -background {} " set normal
"-foreground {} -background {} " }
Znamenajú asi toíko: V prípade, že sa kurzor myši vyskytuje nad objektom
uvedeným v hranatej zátvorke, naším textboxom, priraď premennej link vlastnosti
uvedené v zátvorkách. Čo znamenajú, už netreba vysvetíovať. Stretli sme sa s
tým mnohokrát.
Podobne to napíšeme aj pre premennú normal. V prípade, že sa kurzor myši
vyskytuje mimo nášho objektu, nastavíme premennú link a normal tak, ako je
nastavené pÖvodné prostredie. Príkazom foreach každému tagu v textboxe
nastavíme cez configure vlastnosti odstupu od íavého okraju lmargin
(vzdialenosť 1,5 cm) a pomocou už známej metódy bind priradíme vlastnosti
definovaného linku pri aktivácii tagu a vlastnosť normal pri deaktivácii.
foreach tag {i1 i2 i3 i4 } { $wh.t tag configure $tag -lmargin1 1.5c -font
{-size 14} $wh.t tag bind $tag <Any-Enter> "$wh.t tag configure $tag $link"
$wh.t tag bind $tag <Any-Leave> "$wh.t tag configure $tag $normal"
Nasledujúcimi riadkami dodefinujeme vlastnosti hyperlinku pre dané tagy, tj.
tag, ktorý po nájazde myšou zmení farbu, po kliknutí naň zavolá procedúru
priradenú príkazom bind.
} $wh.t tag bind i1 <1> {Openi1}
$wh.t tag bind i2 <1> {Openi2}
$wh.t tag bind i3 <1> {Openi3}
$wh.t tag bind i4 <1> {Openi4}
Tagom title a text nakonfigurujeme len zarovnávanie podía stredu a vzhíad písma.
$wh.t tag configure title -font {-size 18 -weight bold } / -justify center
$wh.t tag configure text -font {-size 12} -justify center
Do widgetu label vložíme obrázok s danou dížkou a šírkou.
label $wh.obr -image "BookClose" -width 35 -height 35
Príkazom window create utvoríme v textboxe okno, v ktorom sa bude vyskytovať
náš label s obrázkom.
$wh.t window create end -window $wh.obr
Na spodku aplikácie vyrobíme dve tlačidlá a poctivo ich umiestnime.
button .book.dole.quit -text "Quit" -relief groove -command { exit} button
.book.dole.main -text "Index" -relief groove -command {Index} pack
.book.dole.main -side left
pack .book.dole.quit -side right
Na záver tejto procedúry zavoláme inú, s menom Index.
Index
}
proc Index {} {
global wh source
set wh ".book.stred"
$wh.t configure -state normal
Predchádzajúcim riadkom sme zmenili stav textboxu tak, aby nám umožnil vkladať
text.
Nasledujúcim riadkom nastavíme obrázok.
$wh.obr configure -image "BookClose"
Zmažeme všetko od obrázka ďalej.
$wh.t delete 1.1 end
A vložíme text uvedený v úvodzovkách s priradeným tagom.
$wh.t insert end "Indexn" title
$wh.t insert end "Introductionn" i1 $wh.t insert end "Source coden" i2 $wh.t
insert end "FAQn" i3 $wh.t insert end "Licencen" i4
$wh.t insert end "n"
$wh.t insert end "n"
$wh.t insert end "n"
$wh.t insert end "n"
$wh.t insert end "n"
$wh.t insert end "BrunixBookn" text $wh.t insert end "version 1.0n" text
$wh.t insert end "(c) 2000 Mr. Brunixn" text
$wh.t insert end "http://www.brunix.net" text
$wh.t configure -state disabled
Týmto riadkom zablokujeme možnosť vkladať text do textboxu.
}
Táto procedúra sa zavolá po kliknutí na príslušný tag, resp. "link"
proc Openi1 {} {
global BrunixBook wh
Do lokálnej premennej code vložíme obsah súboru v danom adresári.
set code [open $BrunixBook/Intro.txt ]
$wh.t configure -state normal
Textbox otvoríme na zapisovanie, zmeníme obrázok, zmažeme, čo nepotrebujeme, a
vložíme, čo treba.
$wh.obr configure -image "BookOpen"
$wh.t delete 1.1 end $wh.t insert end "Introductionn" title
Týmto spÖsobom docielime výpis obsahu načítaného súboru do textboxu.
$wh.t insert end [read $code]
$wh.t configure -state disabled
Textbox uzavrieme z dobre známych dÖvodov.
}
Analogicky vyrobíme ďalšie procedúry na zobrazovanie iných textov pri kliknutí
na iné tagy, resp. "linky".
proc Openi2 {} {
global BrunixBook wh
set code [open $BrunixBook/Book.tcl ]
$wh.t configure -state normal
$wh.obr configure -image "BookOpen"
$wh.t delete 1.1 end $wh.t insert end "Source coden" title
$wh.t insert end [read $code]
$wh.t configure -state disabled
}
proc Openi3 {} {
global source wh BrunixBook
set code [open $BrunixBook/FAQ.txt ]
$wh.t configure -state normal
$wh.obr configure -image "BookOpen"
$wh.t delete 1.1 end $wh.t insert end "FAQsn" title
$wh.t insert end [read $code]
$wh.t configure -state disabled
}
proc Openi4 {} {
global source wh BrunixBook
set code [open $BrunixBook/Licence.txt ]
$wh.t configure -state normal
$wh.obr configure -image "BookOpen"
$wh.t delete 1.1 end $wh.t insert end "Licencen" title
$wh.t insert end [read $code]
$wh.t configure -state disabled
}
A úplne na záver zavoláme hlavnú procedúru Book.
Book
Týmto príkladom sme vlastne vyčerpali všetky hlavné objekty knižnice Tk, no
zďaleka sme nevyčerpali možnosti, ktoré nám Tcl/Tk poskytuje. Teraz sa pozrieme
na niektoré, dalo by sa povedať aplikované widgety knižnice Tk. Podobne ako v
iných GUI knižniciach, existujú aj tu definované dizajny a objekty pre message
boxy, otváranie a ukladanie súborov, výber farby alebo fontu. Spravme si teda
jednoduchý tlačidlový panel v Tcl/Tk, odkiaí budeme po stlačení príslušného
tlačidla volať dané objekty.
V hlavnej procedúre Main vytvoríme tento panel stálym čitateíom tohto seriálu
už asi netreba vysvetlovať, čo jednotlivé príkazy v tejto procedúre znamenajú.
#!/usr/bin/wish -f
proc Main {} {
global color w
set color "white"
frame .main
pack .main -expand yes -fill both
frame .main.2 -relief groove
pack .main.2 set w ".main.2"
button .main.2.fs -text "File selection" -command {Open}
button .main.2.fv -text "File save" -command {Save}
button .main.2.cd -text "Set color" -command {Setcolor}
label .main.2.f -background $color -width 4 -height 1
button .main.2.m -text "Message" -command {Message}
button .main.2.q -text "Quit" -command {Question}
pack $w.f $w.cd $w.fs $w.fv $w.m $w.q -side left
}
Vytvorili sme panel s tlačidlami a farebným štítkom, ktorý bude slúžiť na
demonštráciu pÖsobenia procedúry Setcolor. proc Setcolor {} {
global color
set color [tk_chooseColor -title "Choise color of label"]
if { $color == ""} then { set color white} else {
.main.2.f configure -background $color }
}
V nej deklarujeme globálnu premennú color. Príkazom set priradíme danej
premennej hodnotu z widgetu tk_chooseColor s parametrom title nastavujúcim
nadpis zobrazeného objektu, ako mÖžete vidieť na obrázku.
Podmienkou if testujeme, či užívateí zvolil nejakú farbu, v prípade, že nie
(napr. stlačil tlačidlo Cancel), priradíme premennej našu implicitnú farbu,
bielu (to len pre istotu).
V prípade, že si užívateí zvolí farbu, zmeníme farbu príslušného štítku na
tlačidlovom paneli pomocou príkazu configure.
Nasledujúca procedúra Open zavolá objekt tk_getOpenFile, ktorý umožnuje otvoriť
z vybraného adresára súbor.
proc Open {} {
set types {
{"BrunixCAD files"{.bxc}}
{"TEX files"{.tex}}
{"All files"*} }
set file [tk_getOpenFile -filetypes $types ]
}
V procedúre Open sme lokálnej premennej file priradili obsah súboru otvoreného
pomocou tk_getOpenFile s parametrom filetypes, kde sme v premennej types
zadefinovali užívateíské súborové prípony.
Analogicky pracuje aj procedúra Save s widgetom tk_getSaveFile.
proc Save {} {
set types {
{"BrunixCAD files"{.bxc}}
{"TEX files"{.tex}}
{"All files"*} }
set file [tk_getSaveFile -filetypes $types ]
}
S objektom tk_message box sme sa uz v našom seriáli stretli.
proc Message {} {
tk_messageBox -type ok -icon info -title "Message" -message "Zdravime
Linuxworld!"
}
Parametrom type zvolíme typ messageboxu, -icon zadefinuje typ zobrazenej
ikonky, -message nám zobrazí zvolený text.
Ďalšia procedúra zavolá ten istý objekt tk_messageBox, teraz však s parametrom
type yesno.
proc Question {} {
set odpoved [tk_messageBox -type yesno -icon question -title "Question"
-message "Are you sure"]
if {$odpoved =="yes"} {exit} else {
}
Príkazom set priradíme premennej odpoved hodnotu získanú z objektu
tk_messageBox, ktorú zvolí užívateí po kliknutí na príslušné tlačidlo.
Nasledujúcou podmienkou potom zariadime adekvátne vetvenie.
}
Main
Nakoniec zavoláme hlavnú procedúru Main.
Podrobnosti o tom, aké typy parametrov mÖžu jednotlivé objekty v Tcl/Tk
používať, sa dozviete z manuálových stránok (shell> man tk_nejakyobjekt).
Na záver
Ako som spomínal, v našom seriáli sme vyčerpali popis asi všetkých dÖležitých
objektov Tcl/Tk, nie však možnosti použitia. S aplikáciami v Tcl/Tk sa vo svete
Linuxu stretávame často a asi ešte dlho budeme. Objekty Tk knižnice využívajú
aj iné skriptovacie jazyky, takže ich možno stretnete v tejto podobe. Tak alebo
tak, dúfam, že sa vám Tcl/Tk aspoň trochu páči a tento seriál vás inšpiruje na
písanie vlastných, malých či veíkých aplikácií pod Linux.
1 0391 / wep









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.