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

Po našom prvom zoznámení sa s jazykom Tcl/Tk a úspešnej "rozcvičke" na dvoch malých príkladoch sa teraz pokúsime napr...


Po našom prvom zoznámení sa s jazykom Tcl/Tk a úspešnej "rozcvičke" na dvoch
malých príkladoch sa teraz pokúsime naprogramovať trochu hutnejšiu aplikáciu, v
ktorej si dáme randez-vous s ďalšími objektami a metódami tohto skriptovacieho
jazyka. Ako vidno z obrázkov, ide o program, v ktorom sa nám vykreslujú dva
geometrické elementy a my ich vzhíad mÖžeme kombinovane meniť pomocou
štandardného popup menu a objektov nazývaných škály. Takže, začnime s kódom:
#!/usr/bin/wish -f
global ovcis x voll farba tvar vol far hodvol hodfar
set ovcis 0
set vol 1
set far 0 set x 10
set voll 10
set farba "red"
set tvar "rectangle"
Prvý riadok asi nepotrebuje žiaden komentár. Pre tých, ktorý už zabudli, tento
riadok volá interpreter wish, ktorý nám kód premení na úvodný obrázok, resp.
aplikáciu.
Nasleduje deklarácia globálnych premenných a ich prvé nastavenie príkazom set
premenná hodnota. Prvá premenná obsahuje poradové číslo vykresleného
geometrického tvaru. Jeho zmysel si vysvetlíme neskÖr. Ďalej sa deklaruje
hodnota objemu resp. veíkosti, pomocná premenná, farba, poloha, pomocná
premenná, počiatočná farba a tvar.
frame .main -bd 1
pack .main -expand yes -fill both
frame .main.hore -bd 2 -relief groove
frame .main.vlavo -bd 2 -relief groove
frame .main.vpravo -bd 2 -relief sunken
pack .main.hore -side top -expand yes -fill x
pack .main.vlavo .main.vpravo -side left -expand yes-fill both
V tejto časti zadefinujeme pomocou frame tri logické a zároveň priestorové
časti z celkovej plochy okna aplikácie. Význam kódu by mal byť jasný z
predchádzajúcich častí seriálu. Venujme teraz pozornosť vytvoreniu roletkového
menu v rámci .main.hore
menubutton .main.hore.tvar -text "Objekt" -menu
.main.hore.tvar.menu
menubutton .main.hore.about -text "O aplikácii"
-menu .main.hore.about.menu
menu .main.hore.tvar.menu
.main.hore.tvar.menu add radiobutton -label "Hranol"
-command {set tvar "rectangle" ; Volume {1} ; set hodvol 1 }
.main.hore.tvar.menu add radiobutton -label "Kruh"
-command {set tvar "oval"; Volume {1}; set hodvol 1 }
menu .main.hore.about.menu
.main.hore.about.menu add command -label "Verzia" -command {Message}
.main.hore.about.menu add command -label "Koniec" -command {exit}
pack .main.hore.tvar .main.hore.about -side left
Objekt Menubutton
Objektom menubutton vytvoríme hlavné menu v ponukovej lište s parametrom text,
nesúcom názov jednotlivých ponúk (v tomto prípade dve tlačidlá s názvom
"Objekt" a "O aplikácii") a druhým parametrom menu názov_objektu.menu ktorý
znamená, že po stlačení tlačidla menubutton sa objaví roletka so submenu
názov_objektu.menu, ktorú definujeme odstavcom začínajúcim príkazom menu
názov_objektu. V nasledujúcom riadku pridávame do submenu prvú položku
radiobutton, prepínač, s názvom Hranol a s vlastnosťou command, ktorá po
kliknutí na túto položku vykoná priradenie dvoch premenných a volá procedúru
Volume s paramterom 1. Podobne pridáme aj druhý prepínač s názvom Kruh.
Analogicky postupujeme aj pri vytvorení submenu pre tlačidlo "O aplikácii", kde
však namiesto prepínača radiobutton použijeme položku command, ktorá deklaruje
"klikací štítok". S parametrov je jasné, že po kliknutí na Verzia sa zavolá
procedúra Message a kliknutím na Koniec sa aplikácia ukončí (čo sa väčšinou od
podobne nazvaných tlačidiel požaduje). Nakoniec ich príkazom pack umiestime v
hornom frame. Naše menu neobsahuje akcelerátory, tj. klávesové skratky typu
CTRL+Q atď., ktoré sme zatiaí z didaktických dÖvodov vynechali. Tcl/Tk však bez
problémov zvládne aj to.
frame .main.vlavo.f
label .main.vlavo.f.nad1 -text "Objem:"
scale .main.vlavo.f.volume -width 8 -from 1 -to 100
-orient horizontal -command { Volume } -variable hodvol
label .main.vlavo.f.nad2 -text "Farba:"
scale .main.vlavo.f.pol -width 8 -from 0 -to 5
-orient horizontal -command {Farba} -variable hodfar
pack .main.vlavo.f
pack .main.vlavo.f.nad1 .main.vlavo.f.volume
.main.vlavo.f.nad2 .main.vlavo.f.pol V tomto odseku je vytvorený
podrámec .main.vlavo.f. PÖvodne som chcel pod seba umiestniť dve takéto rámcové
časti, v jednej sú škály a v druhej mal byť nejaký text, od čoho som neskÖr
upustil. Vy si však mÖžete vytvoriť frame .main.vlavo.f2 s nejakým textom alebo
obrázkom, a umiestniť pod .main.vlavo.f.
V našom rámci vytvoríme popisný štítok s názvom Objem a pod neho uložíme škálu
vytvorenú príkazom scale s nastaveniami width, určuje grafickú dížku, from,
počiatočná hodnota, to, konečná hodnota, orient, orientácia mÖže byť zvislá
alebo vodorovná (vertical, horizontal), command, vykoná príkaz pri zmene
hodnoty, variable, meno premennej v ktorej je uložená aktuálna hodnota
nastavenia. Podobne je vytvorená aj druhá škála s popisom ovládajúca farbu
objektov cez procedúru Farba.
canvas .main.vpravo.c -width 200 -height 200
pack .main.vpravo.c
Príkaz canvas definuje objekt akéhosi plátna, na ktoré je možné kresliť,
umiestňovať rÖzne objekty a tak vytvárať zaujímavé štruktúry. My sme ho
nadefinovali s veíkosťou 200 x 200 bodov a umiestnili do rámu .main.vpravo s 3D
vzhíadom sunken. Prvá procedúra
Nasleduje prvá procedúra Volume s predávaným parametrom vol.
proc Volume {vol} {
global ovcis voll x farba tvar
.main.vpravo.c delete "objekt$ovcis"
set ovcis [expr $ovcis + 1]
set voll [expr $x+10+($vol*1.7)]
.main.vpravo.c create $tvar $x $x $voll $voll -fill
$farba -tags "objekt$ovcis"
}
Po deklarácii globálnych premenných nasleduje príkaz pre objekt canvas, delete
"objekt", ktorý zmaže objekt s daným menom umiestnený v canvas. Zatial tam
žiaden nie je, takže to na chvííu ignorujme. Zmysel bude jasný po analýze
riadku .main.vpravo.c create...
Tento príkaz vytvorí objekt daný premennou $tvar (samozrejme musí to byť
kanonický výraz, v našom prípade rectangle hranol, obdížnik a oval ovál, v
špeciálnom prípade kruh) v canvas. Premenné $x $x a $voll $voll určujú
súradnice íavého horného a pravého dolného rohu obdížnika, do ktorého je
vpísaný geometrický tvar. Tu sú pre x a y súradnice rovnaké hodnoty, takže
výsledkom bude štvorec alebo kruh. Symbol $ pred premennou prekladaču určuje,
že má použiť hodnotu premennej a nie jej meno. Parameter fill vyplní daný
objekt zvolenou farbou, -tags priradí meno novo vytvorenému objektu. To nám
umožní odkazovať na konkrétny objekt vytvorený v canvas. Teraz by už mal byť
jasný mechanizmus procedúry Volume. Starý objekt v canvas sa zmaže a vytvorí sa
nový so zmenenými parametrami. Túto zmenu generujú riadky s príkazmi set, v
ktorých priradíme premenným obsah výrazu v hranatej zátvorke.
V nej sa vyskytuje výraz expr, ktorý zabezpečí vyčíslenie aritmetických výrazov
uvedených v zátvorkách.

Farba
Ďalšia procedúra Farba s parametrom far obstaráva zmenu farby nakreslených
objektov.
proc Farba {far} {
global ovcis voll x farba tvar
.main.vpravo.c delete "objekt$ovcis"
set ovcis [expr $ovcis + 1]
if {$far == 0} then {set farba "red"}
if {$far == 1} then {set farba "orange"}
if {$far == 2} then {set farba "yellow"}
if {$far == 3} then {set farba "green"}
if {$far == 4} then {set farba "blue"}
if {$far == 5} then {set farba "magenta"}
.main.vpravo.c create $tvar $x $x $voll $voll -fill
$farba -tags "objekt$ovcis"
}
Analogicky ako predtým mažeme a vytvárame nové objekty v canvas, teraz však
meníme farbu podía hodnoty parametra far, ktorú testujeme sériou podmienok typu
if then, dÖverne známej všetkým programátorom.
Na záver malá procedúra aktivovaná kliknutím na položku Verzia v submenu O
aplikácii.
proc Message {} {
tk_messageBox -icon info -type ok -message "Tcl/Tk Demo
1.0 n (c) 2000 Mr. Brunix n brunix@madein.sk" -title O aplikácii"
}
Používa sa v nej už naprogramovaný objekt knižnice Tk, tk_messageBox , ktorý
vytvorí nové okno so správou, v tomto prípade na základe príslušného nastavenia
s ikonou info, s jedným tlačidlom OK, ktoré zruší messagebox a správou uvedenou
v úvodzovkách. A to je všetko. Takže skriptujte, modifikujte, spúštajte.
1 0212 / pen









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