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

Dnes sa v našom seriáli zoznámime s ďalšími objektami Tk knižnice, listboxom a scrollbarom, pomocou ktorých si naprogr...


Dnes sa v našom seriáli zoznámime s ďalšími objektami Tk knižnice, listboxom a
scrollbarom, pomocou ktorých si naprogramujeme pomerne užitočnú vecičku,
jednoduchého správcu súborov. Samozrejme, predstavíme si zároveň aj iné
sympatické metódy jazyka Tcl/Tk. Náš správca súborov okrem browsovania po
adresároch a súboroch bude vediet len vytvoriť adresár, ale na demonštráciu to
stačí. Je na vás, či si doprogramujete ďalšie možnosti. Pre úplnosť uvádzam URL
www.helpde.sk/dir.html, kde opäť nájdete zdrojový kód tohoto príkladu.
Priblížme si teraz tento skript.
#!/usr/bin/wish -f
global dirl dirr actdl dirll dirrr activewindow
set actdl ".."
set dirll ".."
set actdr ".."
set dirrr "/home"
set activewindow 2
Tu voláme interpreter, deklarujeme a inicializujeme premenné, ktorých zmysel
nám bude jasný neskÖr.
V nasledujúcej časti vytvoríme logické a plošné delenie hlavného okna znova
pomocou rámcov hore, dole, víavo, vpravo a umiestnime ich do hlavného rámca s
patričnou geometriou.
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 groove
frame .main.dole -bd 2 -relief groove
pack .main.hore -side top -expand yes -fill x
pack .main.dole -side bottom -expand yes -fill x
pack .main.vlavo .main.vpravo -side left -expand yes -fill both
Pokračujeme vytvorením popisných štítkov s nadpisom aplikácie s parametrom
-font, ktorý umožnuje meniť typ a veíkosť fontu. Umiestnime ich do
rámca .main.hore
label .main.hore.nad -text "Simple File Manager" -font {-size 14}
label .main.hore.nad1 -text "from" -font {-size 10}
label .main.hore.nad2 -text "Mr. Brunix" -font {-size 12}
pack .main.hore.nad .main.hore.nad1 .main.hore.nad2 V spodnom rámci vytvoríme
tlačidlá s nápisom Make directory a Quit s odkazom na procedúru Makedir a
príkaz exit. Jeden umiestnime víavo a druhý na opačný koniec rámca .main.dole
button .main.dole.mkdir -text "Make directory" -command {Makedir}
button .main.dole.quit -text "Quit" -command {exit}
pack .main.dole.mkdir -side left pack .main.dole.quit -side right
Pozrime sa teraz na procedúru Ovlavo (názov znamená Okno víavo). Deklarujeme a
inicializujeme premenné, do premennej wl sme uložili názov rámca, aby sme ho
nemuseli stále písať pri odvodených objektoch. Teóriu predávania obsahu
premenných sme si už objasnili v minulej časti.
proc Ovlavo {} {
global wl dirl actdl dirll
set wl ".main.vlavo"
set dirl $dirll
label $wl.dir -text $dirl -relief sunken -background #EEEEEEEEFFFF Ako vidíte z
prechádzajúceho riadku, použitá syntax zjednodušuje zápis nových objektov v
tomto rámci.
Tu sa stretávame s novým objektom scrollbar. Ten predstavuje posuvnú lištu,
ktorá v spojitosti s iným vhodným objektom (listbox, canvas, textbox) umožnuje
rolovanie obsahu vymenovaných objektov. Pri pohíade na úvodný obrázok by to
malo byť úplne jasné.
scrollbar $wl.yscroll -relief sunken -command "$wl.ltable yview" Nastavíme mu
3D vzhíad a obsahom parametra command ho previažme s nasledujúcim objektom
listbox a vertikálnym posunom prvkov listboxu.
Listbox je vlastne zoznam nejakých položiek, v našom prípade bude obsahovať
zoznam adresárov a súborov. (Viď obrázok.)
listbox $wl.ltable -relief sunken -width 20 -height 15 -background
#EEEEEEEEFFFF -yscroll "$wl.yscroll set"
pack $wl.dir -side top -expand yes -fill x
pack $wl.ltable $wl.yscroll -side left -expand yes -fill both
}
Rovnako aj listboxu nastavíme grafický vzhíad (3D, dížku, šírku, farbu pozadia)
a parametrom -yscroll ho funkčne previažme s už spomínaným scrollbarom.
Procedúra Ldirl nám naplní listbox v íavom okne požadovanými prvkami.
proc Ldirl {} {
global wl dirl dirll actdl
$wl.ltable delete 0 end
Predchádzajúci riadok najprv zmaže všetky položky v zozname. Hodnota 0 označuje
nultú položku, resp. "prvú" a slovo end koncovú.
Nasledujúci cyklus inicializovaný príkazom foreach nám umožní každú položku
získanú zo zoznamu vylistovaných adresárov a súborov uložiť do listboxu.
foreach i [exec ls -a /$dirl] { $wl.ltable insert end $i
}
Výraz exec ls a /$dirl, vykoná príkaz listingu pomocou všetkým Linuxákom
známeho príkazu ls. V prípade, že chcete tento program používať na inej
platforme, treba ho v tomto zmysle patrične ošetriť. Pomocou insert vložíme
danú položku s poradovým číslom i do zoznamu. Slovo end určuje, že položky sa
budú pridávať od konca.
Nasledujúcou podmienkou testujeme, či vybratá položka je adresár. V prípade, že
áno, pomocou príkazu configure zmeníme obsah štítku nad listboxom, ktorý hrá
úlohu stavového riadku. Zmysel by mal byť jasný zo syntaxe.
if [file isdirectory $actdl] {
$wl.dir configure -text /$dirll} }
Podobne ako íavé okno vytvoríme aj pravé. Používateíom Midnight Commandera
alebo Windows Commandera je jasný dÖvod:
Procedúra je analogická, zmení sa len názov premenných a príslušných objektov.
proc Ovpravo {} {
global wr dirr dirrr actdr
set wr ".main.vpravo"
set dirr $dirrr
label $wr.dir -text $dirr -relief sunken -background #EEEEEEEEFFFF scrollbar
$wr.yscroll -relief sunken -command "$wr.rtable yview"
listbox $wr.rtable -relief sunken -width 20 -height 15 -background
#EEEEEEEEFFFF -yscroll "$wr.yscroll set"
pack $wr.dir -side top -expand yes -fill x
pack $wr.rtable $wr.yscroll -side left -expand yes -fill both
}
Podobne je to aj s "listovacou" procedúrou Rdirr.
proc Rdirr {} {
global wr dirr dirrr actdr
$wr.rtable delete 0 end foreach i [exec ls -a $dirr] { $wr.rtable insert end $i
}
if [file isdirectory $actdr] {
$wr.dir configure -text /$dirrr} }
Teraz všetky štyri procedúry zavoláme, aby sme získali úvodný obrázok.
Ovlavo
Ovpravo
Ldirl
Rdirr
Nasleduje veími šikovná metóda jazyka Tcl/Tk, ako danému objektu pri danom
signále priradiť akciu. Príkaz bind priradí danému objektu v tomto prípade
listboxu v íavom okne pri dvojkliku íavým tlačidlom myši akciu uvedenú v
zloženej zátvorke.
bind .main.vlavo.ltable <Double-1> {
set activewindow 1
.main.vlavo.dir configure -background #00000000FFFF
.main.vpravo.dir configure -background #EEEEEEEEFFFF
Zmeníme farbu pozadia stavových riadkov jednotlivých okien, vytvoríme tak dojem
prepínania medzi oknami. MÖžete si to upraviť na listboxy, možno to bude
efektnejšie.
set dirll [selection get]
Tu priradíme premennej dirll obsah položky listboxu vyznačenej dvojklikom.
set actdl /$dirl/$dirll/
Vytvoríme absolútny názov adresára. (Určite nájdete aj elegantnejši spÖsob ako
to urobiť) a otestujeme ho, či je skutočne adresárom. Ak je, pomocou procedúry
Ldirl vypíšeme jeho obsah, ak nie, považujeme ho za súbor a vypíšeme ho v
stavovom riadku.
if [file isdirectory $actdl] {
set dirl $actdl
Ldirl } else {
.main.vlavo.dir configure -text $dirll }
}
Analogicky priradíme akciu aj pravému oknu.
bind .main.vpravo.rtable <Double-1> {
set activewindow 2
.main.vpravo.dir configure -background #00000000FFFF
.main.vlavo.dir configure -background #EEEEEEEEFFFF
set dirrr [selection get]
set actdr /$dirr/$dirrr/
if [file isdirectory $actdr] {
set dirr $actdr
Rdirr } else {
.main.vpravo.dir configure -text $dirrr }}
Nasleduje procedúra Makedir zodpovedná za vytvorenie nového adresára. Táto
procedúra vytvorí nové okno pomocou príkazu toplevel, za ktorým nasleduje meno
nového okna.
Nastavíme jeho geometriu s wm geometry .meno_okna rozmery(dížka x šírka v
pixeloch) a nadpis s wm title .meno_okna "názov".
proc Makedir {} {
global wl wr activewindow actdl actdr mdirect
set mdirect "new_directory"
toplevel .mkd
wm geometry .mkd 150x80
wm title .mkd "SMF"
Vyrobíme jednoduchý užívateíský dizajn s informačným nápisom a vstupom, ktorého
premenná bude názov nového adresára a tlačidlom, ktoré dané okno zruší, keď si
to s vytváraním nového adresára rozmyslíme.
label .mkd.nad -text "Insert name of directory"
entry .mkd.en -textvariable mdirect -relief sunken -background #FFFFFFFFFFFF
button .mkd.b -text "Cancel" -command {destroy .mkd}
pack .mkd.nad .mkd.en .mkd.b
Vstupnému boxu priradíme akciu po stlačení klávesy Enter. Tá nám najprv zruší
toto pomocné okno a otestuje si, ktorý listbox, resp. okno aplikácie je
aktívne. Podía toho v príslušnom strome adresárov vytvorí nový.
bind .mkd.en <Return> {destroy .mkd
if {$activewindow == 1} then { exec mkdir $actdl/$mdirect
}
if {$activewindow == 2} then { exec mkdir $actdr/$mdirect
}
Nakoniec ešte zavoláme listovacie procedúry, aby nám nový stav zobrazili v
oknách nášho Simple File Managera.
Ldirl
Rdirr
}}
Jednoduché, však? PÖvodne som tento článok chcel nazvať "Norton Commander
rýchlo a lacno". Samozrejme, na to by bolo treba ešte veía práce. Nie sú tam
ošetrené stavy, ako napr. ak už daný adresár existuje a my ho chceme vytvoriť a
podobne, chýbajú ďalšie dÖležité funkcie ako copy, delete atď. To však zostáva
na vás.
1 0248 / pen









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