Tcl/Tk languages

Tcl je silny skript jazyk, Tk je jeho rozsireni o Motif like toolkit.
(Vyslovuj tickle a tee-kay)

Vyhody Tcl:

Obsah

Vsechny skripty jsou interpretovany (tedy zadna kompilace) shelly tclsh, wish, wishx, itcl_wish, blt_wish nebo vami zkompilovanym shelem. Kazdy z techto shellu se lisi svym pouzitim, tedy tim, ktere sdilene knihovny pouziva a tedy ktere rozsireni Tcl ma v sobe obsazeno. tclsh je shell cisteho Tcl, asi nejpouzivanejsi shell bude wish (tedy windowing shell), ktery obsahuje Tcl a Tk. wish muzete spustit bez parametru a pak se chova jako shell, tedy vy interaktivne zadavate prikazy a po kazdem prikaze dostanete znovu prompt. wish lze ale tak spustit s parametrem -f file, kterym rikate, ze se ma vstup brat ze skriptu file. Dalsi metodou spousteni Tk skriptu je udelat je spustitelnymi a jako prvni radek uvest

#!/usr/local/bin/wish -f
cimz, pokud je to spravna cesta k programu wish, muzete skript spoustet jako shellovske skripty.

Nyni se podivejte na Hello, world program v Tk, uvidite, ze to neni nic sloziteho:

.

(Kliknutim si jej stahnete)

Nyni bych trochu rozebral syntax jazyka Tcl:

Syntax Tcl

Skript

Skript v jazyce Tcl je neco mezi U*xovym shellem a jazykem C. Jednotlive prikazy nejsou zvlastni procesy, jako je tomu v shellu, ale pouze vstupy do sdilene knihovny libtcl.so. Na druhou stranu ma Tcl mnoho veci spolecnych se shellem, ba se mu podoba daleko vice nez jazyku C.
Skript v Tcl je jeden nebo vice prikazu, oddelenych nequotovanymi newliny a stredniky. Prikazy jsou posloupnosti slov, oddelenych whitespace, kde prvni slovo urcuje prikaz a dalsi slova jsou jeho parametry. Zde bych poznamenal, ze naprosta vetsina veci v Tcl se odehrava v retezcich, vsechny parametry jsou retezce, promenne retezce, navratove hodnoty retezce. Pri interpretaci Tcl nejprve rozdeli prikazy na slova, pak provede vsechny substituce, zavola prikaz a vrati stringovou hodnotu.

Substituce


Uvozovky " a slozene zavorky maji v Tcl zvlastni vyznam. Uvozovky rusi deleni na slova mezi nimi, tedy cely text (bez krajnich uvozovek) je parsovan jako jedno slovo. Slozene zavorky delaji totez, ale rusi take vsechny substituce. Substituce na nich mohou byt provedeny pozdeji, pokusi-li se nejaky prikaz toto slovo spustit jako Tcl skript (napriklad prikaz while, ale nikdy nedojde k tomu, aby se na jednom a tomtez textu provedly substituce vice nez jednou. Nikde sice neni specifikovano, jak maji opticky vypadat vase skripty, ale u slozenych zavorek je dle syntaxe Tcl nutnosti, aby otevirajici slozena zavorka lezela jeste na stejne radce jako predchazejici slovo prikazu, jinak by se brala uz jako dalsi prikaz. Ve skriptech si muzete delat komentare za znakem #, ktery je prvnim nemezerovym znakem prikazu (tedy musite napsat
expr $a + $b; # secte a s b
strednik, chcete-li komentar na stejnem radku jako prikaz.

Promenne

mohou mit v Tcl jakekoli jmeno, doporucuje se vsak C konvence. Funkce pro praci s promennymi jsou:
append var value ?value...?
pridava k hodnote promenne var hodnoty value tak, ze vzdy prida (strcat) mezeru a value string.
incr var ?incr?
zvetsuje hodnotu promenne (v tomto pripade musi byt string reprezentujici numerickou hodnotu) o incr a neni-li incr specifikovan, o 1.
set var ?value?
nastavuje hodnotu promenne var na value.
unset var ?var...?
rusi promennou var (nebo promenne).
V Tcl neni potreba promenne deklarovat, jsou to vzdy retezce neurcene delky, vytvori se prvnim nastavenim. Pole jsou v Tcl tvorena pomoci promennych tvaru varname(indexname), kde varname a indexname jsou retezce. Samozrejme muzete pouzivat indexname numericky, cimz simulujete C pole. Vicerozmerna pole v Tcl neexistuji, ale muzete je simulovat napriklad pouzivanim indexu tvaru 1,5, coz je retezec a muze byt tedy pouzivan v nazvech promennych. Prace s poli se tyka nasledujici prikaz (vybiram jen nektere varianty):
array size var
vraci pocet definovanych indexu pole var.
array names var
vraci seznam (tedy posloupnost slov oddelenych mezerami) definovanych indexu pole var.

Vyrazy

Nektere prikazy maji jako sve parametry vyrazy. Jsou to stringy jako kazde jine, jen se na ne aplikuje matematicka engine. Cisla jsou zde bud cela, a to decimalni, oktalova (zacinaji 0) nebo hexadecimalni (0x) nebo realna (v plne shode s ANSI C zapisem). Operatory jsou zde take velice podobne C:
- ! ~ * / % + - << >> < > <= >= == != & ^ | && || ?:,
s tim rozdilem, ze napriklad == muzete pouzivat i k porovnavani retezcu. Samozrejmosti jsou matematicke funkce, ktere se zapisuji v obvyklem formatu, napr. sin($x). Pokud chcete nastavit presnost realnych cisel, muzete tak ucinit nastavenim promenne tcl_precision na hodnotu 0 - 17.

Seznamy

jsou v Tcl stringy obsahujici slova oddelena mezerami nebo tabelatory. Existuje zde pomerne mnoho funkci pro praci s nimi, ale to neni zadne prekvapeni, vzdyt samotne Tcl prikazy jsou vlastne seznamy parametru.
concat list ?list?
Spojuje vsechny seznamy, ktere dostane jako argumenty, do jedineho seznamu.
join list ?sep?
Vrati retezec, ktery vznikne nahrazenim mezer oddelujicich prvky seznamu list retezcem sep.
lappend var value ?val...?
Prida do seznamu var hodnoty value, val...
lindex list index
Vrati index-ty prvek seznamu list, pocinaje od 0.
linsert list index value ?val...?
Vlozi na index-te misto v seznamu slova value, val...
list value ?value?
Vrati seznam, kde jeho jednotlivymi prvky jsou jednotlive argumenty.
llength list
Vraci delku seznamu.
lrange list first last
Vraci cast seznamu pocinaje first-tym prvkem a konce last-tym prvkem. last muze byt cislo podobne jako first (od 0) nebo end znacici posledni prvek.
lreplace list first last ?value...?
Nahradi range first-last hodnotami value...
lsearch -exact / -glob / -regexp list pattern
Hleda zpusobem specifikovanym prvnim - parametrem v seznamu vzor pattern.
lsort
split string ?splitch?
Zde bych ukazal rozdil mezi uzaviranim do uvozovek, slozenych zavorek a prikazem list. V Tk maji nektere widgety volbu -command, ktera specifikuje Tcl skript, ktery se ma spustit pri nejake udalosti. Zvazme tyto tri moznosti:
-command {set x $initval}
-command "set x $initval"
-command [list set x $initval]
Prvni moznost neprovede ihned zadnou substituci a tedy se za x dosadi hodnota promenne initval v dobe volani tohoto event handleru. V druhem pripade se zde sice dosadi hodnota initval na zacatku (protoze se substituce provede jiz pri inicializaci, tedy lepe pri zpracovavani prikazu majici tuto volbu), ale problem muze nastat, sklada-li se tato promenna z vice slov. Pak nastane chyba, protoze set nemuze mit libovolne parametru. Kdyz ale pouzijeme treti variantu, vse probehne podle ocekavani, protoze $initval bude jeden prvek seznamu (list zaridi pripadne uvozovky nebo slozene zavorky).

Prikazy flow control

break
Vyskoci ven z nejvnitrnejsiho looping prikazu (jak, to budu vysvetlovat dale.
continue
Pokracuje novou iteraci nejvnitrnejsiho looping prikazu.
eval arg ?arg...?
Posklada slova argumentu, provede substituce a provede vyslednu prikaz skladajici se z techto slov.
for script1 expr script2 script3
Provede script1, vyhodnoti expr vyraz (ktery je nutno uvest v slozenych zavorkach, aby se substituce provadeli pri kazde iteraci, jinak by doslo k vecnemu loopu) a je-li nenulovy (tedy != "0"), provede script3 (telo) a pote script2 (podobne jako u for v C). Pak znovu vyhodnoti expr a znovu...
foreach var list script
Pro kazdy prvek seznamu list priradi hodnotu tohot prvku do promenne var a provede script.
if expr ?then? script ?elif? script ?...? ?else? script
Klasicky if prikaz znamy z C.
source filename
Nahraje filename a spusti jej jako Tcl skript a vrati hodnotu jeho posledniho prikazu.
switch -exact / -glob / -regexp string pattern ?script pattern script? ...
(pripadne je mozne cast pattern a dale uzavrit do slozenych zavorek, by se to vic podobalo C) postupne porovnava zpusobem specifikovanym - volbou string s jednotlivymi pattern a v pripade shody spusti nasledujici skript. Poslednim pattern muze byt default, ktery matchuje vse.
while expr script
Obycejny while prikaz, nezapomente jen uvest expr ve slozenych zavorkach, aby se vyhodnocovala znovu a znovu.

Procedury

Procedury vam umoznuji definovat nove Tcl prikazi primo v Tcl, aniz byste museli psat rozsirujici knihovnu v C a linkovat ji s novym Tcl shellem (i kdyz to je samozrejme nekdy vyhodnejsi a nekdy nutnost).
proc name list script
name je jmeno procedury, list seznam jejich argumentu, ktery misto jmen techto argumentu muze obcas obsahovat i dvouprvkove seznamy jmeno a defaultova hodnota (jako v C++) a script je vlastni telo procedury.
global varname ?varname...?
definuje promenne varname... jako globalni, tedy vsechny nasledujici reference na ne v procedure se budou tykat globalnich promennych s temito jmeny.
return ?options? ?value?
Slouzi k navratu z procedur a take ke generovani chyb
uplevel ?#level? arg ?arg...?
Spousti prikaz arg ... na stack urovni specifikovane level, coz muze byt bud #0 pro globalni uroven, nebo #-N pro uroven o N vyse nez aktualni zanoreni procedury.
upvar ?#level? other local
Spojuje lokalni promennou local s promennou other z urovne level (implicitne -1).
Pomoci uplevel muzeme definovat takove prikazy, jako napr. do, ktere iteruje svuj ctvrty argument podle promenne pojmenovane prvnim argumentem od druheho do tretiho argumentu:
proc do {var first last body} {
	upvar $var v
	for {set v $first} {$v <= $last} {incr v} {
		uplevel $body
	}
}
Toto je jen priklad, nechodily by v nem prikazy break a continue, i to vsak lze v Tcl zaridit.

Chyby

Kazdy Tcl prikaz muze skoncit bud normalne, nebo chybou. Pokud skonci chybou, nasledujici prikazy v tom konkretnim Tcl scriptu se neprovedou. (Tedy Tcl preskoci vse do konce {}, "" nebo celeho scriptu). Nasledujici prikazy vam dovoluji pracovat s chybovymi kody a prebirat rizeni v pripade chyby:
catch script ?varname?
Tento prikaz spusti script jako Tcl skript, hodnotu, kterou vrati, ulozi do promenne varname, uvedete-li ji tam, a vrati cislo chyby, ktera se pripadne vyskytla pri vykonavani scriptu. (Jinak vraci 0). catch tedy, pokud ho volame se spravnymi parametry, nikdy nevraci error...
error msg ?info? ?code?
Vrati chybu, ale nejprve vypise msg na standartni vystup a nastavi promenne errorInfo a errorCode na hodnoty, ktere pripadne uvedete.
return ?-code code? ?-errorinfo info? ?-errorcode code? ?string?
V nejjednodussi verzi je to navrat z procedury, ale pouzijeme-li code nastavene na ok, error, return, break, continue nebo nejake cislo, vrati se return s chybou (tedy u ok bez chyby) error = 1, return = 2, break = 3, continue = 4 nebo se zadanym cislem, ktere pak muzeme o uroven vyse pomoci prikazu catch examinovat. Na to vizte priklad procedury proc do {varName first last body}, ktera zvlada prikazy break, continue a return vyskytujici se v body skriptu.

Retezcove prikazy

Tcl zvlada praci s retezci pomerne na slusne urovni, vzdyt take je to jedinny typ promennych v nem. Nasledujici prikazy umoznuji a usnadnuji praci s nimi:
format formatStr ?value...?
Obdoba C knihovni funkce sprintf, ale vysledek je navracen jako navratova hodnota.
regexp ?-indices? ?-nocase? ?--? exp string ?matchVar? ?subVar subVar...?
Prohleda string na regularni vyraz exp. Vizte dokumentaci k podrobnejsimu popisu.
regsub
To same jako regexp, ale s parametry vhodnymi k substitucim.
scan string format varName ?varName...?
Obdoba C knihovni funkce sscanf.
string subfunction arguments...
je kolekce funkci pro praci s retezci. Napriklad jsou zde subfunkce compare (strcmp), index (str[i]), length (strlen), match (porovnavani), range (vraci substring), tolower, toupper, trim (odstranuje vsechny pocatecni a koncove mezery) a obdobne trimleft, trimright.

File I/O

Tcl poskytuje sirokou skalu funkci pro praci se soubory, kterou jeste daleko rozsiruje TclX, rozsireni Tcl. Zde vyjmenuji jen nektere pouzitelne funkce pro praci s nimi:
open name ?access?
Tato funkce vraci retezec jednoznacne identifikujici soubor jmena name, ktery otevrel s pristupovymi pravy access. Velice se podoba fci fopen, access se zadava jako retezec typu r (defaultni), w, wb, atd...
pwd
Asi nemusim vykladat, co udela tohle :-)
glob pattern ?pattern...?
Tato funkce vrati seznam vsech jmen souboru, ktere matchuji shellove patterny pattern, ... Pokud nektera pattern konci na /, budou ji matchovat pouze adresare.
file subfunction ?arguments?
Balik souborove orientovanych prikazu Tcl, subfunction rika, o co jde. Je jich opravdu mnoho, odkazuji vas timto na manual. Jednu za vsechny bych jmenoval readable, ktera rika, je-li soubor citelny pri vasem euid a egid.
Dalsimi funkcemi jsou napr. puts a gets, ktere se chovaji stejne, jako v C. Toto samozrejme neni vycerpavajici seznam.
Pokud mate zajem, stahnete si tady kliknutim mysi skript tgrep, ktery je jednodussi obdobour grepu v Tcl:


Procesy

Samozrejme, ze muzete z Tcl volat jine procesy a ziskavat jejich vystup ci posilat jim vstup atd. Pomohou vam k tomu tyto prikazy:
exec ?options? arg ?arg...?
Timto prikazem spoustite subproces(y). Argumenty jsou jednotliva slova radky, kterou byste zadali shellu (tedy vcetne pipe a presmerovani). Pokud neni standartni vystup posledniho prikazu v pipe presmerovan, vrati exec standartni vystup tohoto prikazu.
exit ?code?
Timto prikazem ukoncujete vas Tcl skript s navratovym kodem code.
open |command ?access?
Je-li prvnim pismenem prvniho slova parametru open znak |, otevre se roura k tomuto prikazu a podle pristupovych prav z ni muzete bud cist, nebo do ni psat (obdoba popen).
pid ?fileId?
Vraci pid vaseho scriptu (volate-li bez argumentu) nebo seznam pid subprocesu spustenich prikazem open |, ktery toto fileId vratil.

Jine

Tcl nabizi nektere dalsi prikazy, ktere jsem shora nezminil. Jsou to napriklad:
time
trace variable varname ops command
Umoznuje vam jednoduse debugovat vase skripty. Zavola command, kdykoli se stane udalost specifikovana pomoci ops s promennou varname. Lepsi moznosti debugovani jsou vsak obsazeny az v TclX.
unknown cmd ?arg arg?
Pokud si pomoci proc definujete tuto proceduru, Tcl vam ji zavola, narazi-li ve vasem skriptu na neznamy prikaz. Poskytne vam tento prikaz a vsechny jeho parametry jako argumenty k unknown a vy jste odpovedni za to, abyste vratili to, co ten ktery prikaz mel vratit. To se hodi, je-li potreba natahnout nejakou knihovnu Tcl prikazu.
info
Balik funkci k ziskavani informaci temer o vsem v Tcl.
history
Tcl prikazy jiz provedene jsou implicitne ukladany do historie, ke ktere mate pristup pomoci tohoto baliku funkci (muzete pak delat takove veci jako redo aj.).

Tk - OSF/Motif like toolkit pro X11

Tk je nadstavbou Tcl (jiz jsem se snad zminoval o uzasne rozsirovatelnosti Tcl), ktera vam poskytuje opet rozsiritelny X11 toolkit podobny Motifu. Zakladnim prvkem je tu widget, coz je nejake okno spolu se svymi event handlery a look&feel. Kazda Tk aplikace musi mit prave jedno hlavni okno a pripadne (velice pravdepodobne) nejake jeho potomky (vcetne toplevel oken). Tk skripty jsou rizeny udalostmi podobne jako vsechny X aplikace, na zacatku mate nejaky inicializacni skript a pak uz se spousti jen nejake event handlery (ty jsou vsechny v Tk na globalni urovni).
Shelly, ktere vam umoznuji spoustet Tk aplikace, jsou wish, wishx (ktery ma v sobe TclX a Tk), dale itcl_wish (obsahujici incr_Tcl) a blt_wish (obsahujici knihovnu blt).

V Tk existuji 4 zakladni skupiny Tk-specifickych prikazu (sem tedy nepocitam Tcl prikazy, ktere jsme jmenovali vyse):

Priklady Tk programku:

je jednoduchy directory browser s jednim listboxem


je priklad definovani slozitejsi procedury pro pozdejsi pouziti v Tk programech, konkretne procedury zobrazujici dialogove boxy


je jednoduchy programek na umocnovani ukazujici moznosti packeru


vam umoznuje spoustet shellove prikazy a pamatovat si poslednich pet, ktere pak muzete pomoci buttonu spustit znovu


Widgety a jejich vytvareni

Tk obsahuje standartne 15 widgetu, ktere tvorite pomoci prikazu shodnych s jejich jmeny a s notnou davkou konfiguracnich parametru. Nektere konfiguracni parametry jsou spolecne pro vsechny widgety, nektere pro nejakou jejich skupinu, ale mnoho jich je widget specifickych. Hlavni okno (ktere nemusite vytvaret, bude za vas stejne na zacatku vytvoreno) se jmenuje . a pomoci tohoto jmena k nemu pristupujete. Ostatni widgety se oznacuji podobne jako Unixove soubory, tedy cestou a jmenem, kde cesta jsou vsechny rodice postupne od hlavniho okna a na konec se prida jmeno toho ktereho okna. Rozdelovacim znakem v ceste ale neni / jako u souboru, ale je to . Tedy .a je primy potomek hlavniho okna, .a.b potomek .a, atd. Radsi se jeste jednou kouknete na aplikaci Hello, World!, kde uvidite zakladni strukturu Tk aplikace.

Nyni bych vyjmenoval jednotlive widgety:

frame
Nejjednodussi widget, slouzi pouze k seskupovani objektu, ma jen nejake pozadi a nejaky 3D vzhled. Pouziti najde u geometry manageru.
toplevel
Toplevel okno, obdobne jako u frame neni prilis slozity.
label
Podobny frame s tim rozdilem, ze v sobe zobrazuje nejaky text. Tento text muze byt staticky (-text) nebo to muze byt obsah nejake promenne, ktery se bude menit, kdykoliv se tato promenna zmeni (-textvariable).
button
Klasicky button, muze obsahovat retezec nebo bitmapu a pomoci -command muzete specifikovat Tcl handler, ktery se vyvola, kliknete-li levym tlacitkem mysi na nem.
checkbutton
Odvozeny z button, obsahuje vsak boolovskou volbu spojenou s nejakou promennou zobrazenou zaskrtavaci bitmapou, pri klikani automaticky prepina svuj stav.
radiobutton
Odvozenina checkbutton, ale v nejake skupine dovoluje pouze jednomu radiobuttonu byt naselektovan.
menu
Menu je zde jen jediny widget (tedy ne kolekce buttonu), kter v jednotlivych polozkach obsahuje bud prikaz (command), prepinac (checkbutton), radiobutton, dalsi submenu (cascade nebo horizontalni linku (separator).
menubutton
Jako button, pri stisku se vsak zobrazi asociovane menu.
listbox
entry
Pole, ve kterem muzete jednoradkove editovat. Muze byt propojeno s nejakou promennou, muzete zadat, jak dlouhy text muze uzivatel napsat aj.
scrollbar
text
Toto je uz velmi komplexni widget, umoznujici vam editovat nebo zobrazovat viceradkovy text, ktery muze pomoci tzv. tags mit v nekterych castech specifikovane ruzne atributy, muze dokonce obsahovat i Tk widgety aj.
canvas
Do tohoto widgetu muzete pomoci jeho prikazu kreslit, psat a delat vse, co uznate za vhodne.
scale
Posunovaci lista, muze byt svisla nebo vodorovna a slouzi ke graficke prezentaci a editaci nejake ciselne hodnoty.
message
Zjednoduseny text widget, slouzici k zobrazovani viceradkoveho textu. Nepodporuje tags, vnorene widgety, editaci a je tedy vhodny pro kratke texty v dialozich atd.

Geometry manazery

To, ze vytvorite nejaky widget, jeste neznamena, ze bude zobrazen na vasem displeji. Jednotlive widgety totiz neobsahuji informace o svem umisteni. O to se stara dalsi cast baliku Tk, kterou jsou tzv. geometry managers. Jsou to prikazy (pro kazdy manager jeden a samozrejme ze si muzete napsat i vlastni manazer), ktere dostanou od vas nejake pokyny, identifikatory widgetu, ktere chcete od nich spravovat, interne si vyziskaji informace od techto widgetu o tom, jak by chteli byt velke, a od rodicovskeho okna jeho velikost, potom aplikuji nejaky svuj umistovaci algoritmus a vysledkem je rozlozeni a zobrazeni widgetu v rodicovskem okne a pripadne i zmena velikosti rodicovskeho okna. Nejpouzivanejsimi geometry manazery jsou place a zejmena pack.

Placer

je velice jednoduchym geometry manazerem. Vy mu zadate, kam ma dany widget umistit a on ho tam umisti. Co jednodussiho.
place configure .win option value ?option value...?
.win je jmeno widgetu a option muze byt -x, -yx resp. y souradnice v jednotkach specifikovanych v pristi kapitole, -relx, -rely relativni souradnice vzhledem k velikosti master widgetu, coz je parent widget nebo widget specifikovany pomoci -in (ten ovsem musi byt child parent widgetu naseho okna nebo parent sam), -anchor urcujici svetovou stranou, ktereho rohu ci stredu se tyto volby tykaji a -width, -height, -relwidth, -relheight s vyznamem dovoditelnym s podobnych pozicnich voleb. Slovo configure muze byt vypusteno.
place dependents .win
Vrati seznam vsech widgetu, ktere zaviseji na tomto widgetu at jiz skrzeva -in nebo skrze implicitni prirazeni.
place forget .win
rika placeru, aby odmapoval okno a prestal ho spravovat. Typicky se vola, kdyz chceme na toto okno postvat jiny geometry manager za behu.
place info .win
informace o spravovanem okne.

Packer

je sice slozitejsi, ale urcite pouzivanejsi gm. Dovoluje nam rikat si, ze tento widget chceme vedle toho druheho atd.
pack configure .win ?.win...? option value ?option value...?
.win jsou jmena widgetu a option muze byt -after, -befores parametrem jmeno okna bude povazovat master tohoto okna za master naseho okna a ve spojovem seznamu pro packer je ulozi hned za/pred tento widget. -expand s booleovskou hodnotou jako parametrem v pripade nastaveni zpusobi, ze bude frame widgetu pripadne expandovan, aby se pokrylo vsechno zbyvajici misto v masteru. -fill s parametrem none/x/y/both zpusobi ve specifikovanem smeru vyplneni vseho zbyvajiciho prostoru v masteru po aplikovani vsech pozadavku widgetu predchazejicich ve spojovem seznamu v danem smeru. -padx, -pady, -ipadx, -ipady specifikuje jak interni (s pismenem i), tak externi vypln ramu widgetu v jednotkach definovanych v pristi kapitole. -in urcuje master. -anchor urcujici svetovou stranou, ktereho rohu ci stredu se pouzije, bude-li misto na widget vetsi nez widget sam a -side s hodnotami top/left/right/bottom rika, kam ma byt v dosud prazdnem miste v masteru umisten widget. Slovo configure muze byt vypusteno.
pack slaves .win
Vrati seznam vsech widgetu, ktere zaviseji na tomto widgetu at jiz skrzeva -in nebo skrze implicitni prirazeni.
pack forget .win
rika packeru, aby odmapoval okno a prestal ho spravovat. Typicky se vola, kdyz chceme na toto okno postvat jiny geometry manager za behu.
pack info
informace o spravovanych oknech.

Komunikace s jiz existujicimi widgety

se v Tk provadi pomoci tzv. widgetovych prikazu. S kazdym nove vytvorenym widgetem je definovan i novy prikaz se jmenem shodnym s jmenem widgetu, tedy napriklad .scrollbar. Ten ma vetsinou jako prvni argument jmeno podfunkce, pricemz nektere se tykaji mnoha ruznych widgetu, nektere jen jednoho. Asi nejcastejsim bude .win configure s konfiguracnimi volbami, ktere jinak muzeme specifikovat i pri vytvareni widgetu jako parametry. Zde bych zminil neco o typech hodnot, ktere se volbam zadavaji:
barvy
napr. u voleb -background, -foreground, zadavaji se bud jmeny barev z rgb.txt nebo ve formatu #RRRRGGGGBBBB, kde R, G, B jsou hexa cislice. Nemusite specifikovat tolik hexa cislic, pokud zadate pro jednotlive barvy mene cislic, nejmensi cislice se doplni nulami (ovsem musite vzdy zadat pro vsechny tri barvy R, G, B stejny pocet cislic!), napr. #731 se expanduje na #700030001000.
vzdalenosti
napr. u voleb -borderwidth, -padx, -pady, ... se zadavaji cislem, nasledovanym volitelne mezerou a volitelne symbolem jednotek: c pro centimetry, i pro palce, m pro milimetry, p pro pointy a bez symbolu pro pixely.
3D vzhled
u volby -relief ma hodnoty raised, flat, sunken, ridge, groove. Musite si to vyzkouset, abyste vedeli, jak to vypada.
fonty
se zadavaji klasickym X11 zpusobem, tedy retezcem typu -*-*---123---
bitmapy
u volby -bitmap se zadavaji bud se znakem @ na zacatku - pak je to jmeno souboru obsahujici bitmapu - nebo bez @, pak je to jmeno bitmapy ulozene interne ve skriptu.
kurzory
podobne jako u bitmap, je ale potreba specifikovat dalsi udaje
kotvy
u volby -anchor se zadavaji svetovymi stranami: n, ne, nw, se, s, ..., center
Prikladem pouziti widgetovych prikazu muze byt interakce listboxu s toolbarem:
listbox .l -yscrollcommand {.vscroll set}
scrollbar .vscroll -orient vertical
pack .l -side left
pack .vscroll -side right
.vscroll config -command {.l yview}
Zde jsou pouzity i castecne prikazy - prikaz scrollbaru set ma parametry total windowunit first last, ovsem u texto voleb je za nas Tk doplni podle aktualniho stavu listboxu nebo scrollbaru.

Komunikace mezi widgety a mezi aplikacemi

Mnoho widgetu ma volbu -command, kterou specifikujeme event handler pro v Tk pro ten widget definovanou akci. Mnohem komplexnejsi metodou je ale pouziti prikazu bind, ktery ma parametry win seq script, kde win je jmeno okna, seq je jmeno akce formatu <modifier-modifier-type-detail>, kde modifier je nejaky prerazovac Control, Lock, Shift, Meta, Double, Triple, Any (Any znamena, ze nam nezalezi na stisknutych prerazovacich, Double a Triple se tykaji klikani mysi), type je typ udalosti jako Key, Enter (pohyb mysi do oblasti okna), Button, Map, ... a detail je jmeno klavesy ci cislo mouse buttonu atd. Pokud script zacina znakem + a jiz existuje nejake prirazeni u daneho okna a dane akce nejakeho Tcl skriptu, pak se skript prida na konec. V bind skriptech existuje jeste specialni substituce. %x, %y se nahrazuji x, y souradnicemi mysi, %W Tk jmenem okna, %A ISO oznacenim daneho znaku a %% znakem %. Nejlepsi asi je, aby nam tyto substituce nekomplikovaly zivot, v bind skriptu jen volat nejakou proceduru s parametry, kde v parametrech muzeme uvest tyto %? sekvence a v tele handleru uz nas nebudou mast.

Komunikace mezi aplikacemi (pouze Tk) se provadi pomoci prikazu send, kdy zadame jmeno aplikace a argumenty, ktere tvori Tcl skript, ktery se ma ve vzdalene aplikaci provest. To by se mohlo zdat jako znacna security hole, ale my muzeme posilat send pouze aplikacim na nasem displeji, kam nektere nemusime pustit (bud pres xhost, coz je ale slabe, takze radeji pres xauth). Ostatne totez by se dalo zaridit uz v X11, vzdyt eventy muzeme posilat komukoliv a kdykoliv.

Dalsimi prikazy, ktere Tk obsahuje, jsou select na zmenu a zjistovani X selekce, focus, wm na komunikaci s window managerem, grab na zahazovani vsech eventu chodicich mimo nami specifikovane okno, after na spousteni Tcl skriptu po urcitem casovem intervalu, destroy na zabijeni widgetu (destroy . ukonci aplikaci) a update, coz zpusobi okamzite prekresleni misto cekani, az na to vyzbyde cas.

Rozsireni Tcl/Tk

TclX

TclX 7.3b a novejsi beta verze TclX7.4a-b2 jsou asi nejzakladnejsim rozsirenim, bez ktereho se prakticky neobejdete. Jednak obsahuje aplikaci tclhelp

ktera je zakladni pomuckou pro psani Tcl/Tk scriptu. Obdoba man pages jinde (i kdyz samozrejme manpage existuji, ale tato metoda je snazsi).

Dalsimi oblastmi, ktere TclX rozsiruje, jsou:

debugovani
profiling
vetsi interakce s Unixem pomoci vetsiho baliku prikazu vcetne proces managementu
rozsireni file I/O
prikazy chmod, chgrp, ... copyfile, dup, echo, fcntl, flock...
AWK-like funkce
rozsireni seznamovych prikazu
keyed lists
obdoba C struktur, realizovana pres seznamy obsahujici dvojprvkove seznamy nazev polozky, hodnota. Prikazy keyl*
time, date
TCP/IP server interakce
prikazy server_*
internacionalni aplikace
prikazy catopen, catgets, catclose

incr_Tcl

Jiz sam nazev incr_Tcl, kdyz vezmeme v uvahu, ze incr je v Tcl to same jako ++ v Cecku, napovida, ze jde o jakesi objektove rozsireni Tcl. Pomoci itcl_class definujeme jednotlive tridy a muzeme s nimi pak pracovat. Vice viz dokumentace.

BLT

BLT rozsiruje Tk v mnoha oblastech, jmenoval bych zde funkce drag'n'drop, widget blt_htext, coz je hypertext, novy geometry manager blt_table, ruzne prikazy na tvorbu grafu, prezentaci, neco debugovacich, profilovacich a zaznamenavacich funkci, funkce blt_win umoznujici mapovat, unmapovat a cirkulovat ve stacking orderu jakekoliv X okno.

Aplikace a kde co shanet

Existujici aplikace pod Tcl/Tk

tgdb

tgdb je sharewarovy graficky frontend ke znamemu a neprekonatelnemu gdb. Nabizi rozsahlou skalu funkci gdb pristupne pres menu pripadne klikani mysi. Jednoduse tak muzete nastavovat breakpointy klikanim ve zdrojovem textu, zobrazovat hodnoty oznacenych vyrazu, atd. Jedine, co bych mu vytkl, je neprilis dokonala emulace terminalu (ba primo nedokonala), takze se nehodi pro debugovani cursovych a jinych podobnych textovych aplikaci :-(
K spusteni potrebujete dva baliky - tgdb-1.1.src.tgz a tgdb_wish-linux.src.tgz, coz je wish se zakompilovanymi rozsirenimi TclX, blt, TkSteal a expect. Pro jina rozsireni muzete najit zkompilovane verze nebo si je budete muset zkompilovat sami (soubor INSTALL v tgdb-1.1.src.tgz).

XF

XF je nastroj pro interaktivni tvoreni a modifikaci Tk aplikaci. Ma zasobu preddefinovanych Tk kodu, ktere za vas umistuje do vysledneho Tk programu, vklada za vas do nej interaktivne jednotlive widgety, ktere hned vidite pred sebou. XF nebezi v nejakem samostatnem wishi, ale bezi ve stejnem shellu s aplikaci, takze ji muze opravdu pretvaret k nepoznani :-). Staci vyzkouset. Instalace je velmi jednoducha. A k tomu vam na zacatku pomuze Postscriptovy manual.

tkCD

tkCD je hezky Tk frontend k textovemu CD prehravaci dodavanemu ve stejnem baliku. Ovlada databasi CD a jine podobne sikovne funkce. Opravdovy konkurent workmanu.

tkispell

je hezky shell k ispellu, standartnimu spelling checkeru. Obsahuje jednoduchy editor a interaktivne muzete nahrazovat nalezene preklepy variantami nabidnutymi v listboxu :-)

TeXShell

TeXShell je pomerne pekny shell k TeXu, usnadnujici vam praci v nem. Nemusite jiz psat jednotlive prikazy k zobrazeni, zkompilovani atd., ale ts je provede za vas :-)

kosherdill

kosherdill je jednoducha aplikace obsazena v distribuci rozsireni blt, ktera vam umozni snazsi orientaci o spotrebovanem miste na disku nez dosud pomoci du -s -b. K tomu jsou zde i hezke animace.


Tk aplikace, ktere jsem nerozchodil (vetsinou asi moji vinnou)

tkWWW

tkwm je soubor funkci pro tvorbu Tk window manageru. Jednoduchy window manager (tedy vlastne priklad) je take prilozen.

qddb

qddb je rozsahlejsi databaze pod Tcl/Tk. Zkuste stesti a zkompilujte si ji. Treba se vam to podari.

Tento seznam neni samozrejme vycerpavajici, jine programy hledejte na lincich v nasledujicim odstavci.


Shaneni Tcl, Tk a jejich aplikaci

Pokud jeste nemat Tcl/Tk, doporucuji si ho co nejdrive stahnout zde:
tk3.6.tar.Z
Take si stahnete Postscriptovy draft autorovy knihy o Tcl/Tk, coz jsou vynikajici a vcelku kompletni manual k zakladnimu Tcl/Tk, ktery si jiste cely prectete, nez zacnete cokoliv programovat. Knihy 3 a 4 pojednavaji o rozsirovani Tcl resp. Tk vami psanymi knihovnami v C.
Na Univerzite v Purdue byl zrizen Tcl/Tk archiv, ktery byl nedavno premisten na server Alcatelu. Tam najdete temer vsechno, zbytek odkazuji na sunsite a tsx-11. Tam ale musite vice hledat, nez neco najdete. Tcl/Tk programy tam nejsou soustredeny na jednom miste.
Zajimave veci take muzete najit v newsech v groupe comp.lang.tcl.

Napsal jelinek1@jfch.vc.cvut.cz