Tk - sissejuhatus Graafikaliidese kujundamiseks saab kasutada eeldefineeritud aknaklasside esindajaid (widgets), mis moodustavad puukujulise struktuuri (widget hierarchy) Akende puust lähtuvalt paigutatakse alluvad oma ülemuse piiridesse - erandi moodustavad sõltumatu paigutusega aknad (top-level windows) Liidese käitumist juhitakse X-sündmustega. Programmeerija võib siduda (bind) iga sündmusega (ning iga akna jaoks) mingi Tcl-programmi (event-handler) . Eeldefineeritud käitumine on üldjuhul mõistlik => programmides piisab ainult oluliste sündmuste sidumisest Joonistamine/paigutamine on lahutatud liidese loogilisest struktuurist, sellega tegeleb eraldi programm - paigutushaldur (geometry manager). Ilma paigutushaldurita ei teki ekraanile ühtegi akent! Klassid (widget classes): frame, label, button, checkbutton, radiobutton, menubutton, menu, message, entry, text, canvas, scrollbar, scale, listbox, toplevel, ... Ülesanne: tutvuda widget-demoprogrammiga: /opt/local/lib/tk8.0/demos/widget & Klasside esindajad luuakse klasside nimesid kandvate Tcl-käskudega (widget creation commands): button .b -text Quit -command exit Esimeseks argumendiks on akna nimi (liitnimi, mille osad eraldatakse punktiga), järgnevad konfigureerimisparameetrid Akna nimi muutub Tcl-käsuks, mille abil saab aknaga suhelda (widget command): .b configure -background red X-ressursside andmebaas on kasutatav ja muudetav Tk-s Tk on püütud teha nii, et graafikaliidese olek oleks igal hetkel programselt loetav ning muudetav Tk programm võib juhtida teise Tk-programmi tööd (send-käsk), samuti suhelda aknahalduriga (wm-käsk) button .tere -text Tere \ -command { puts stdout "Tere hommikust!" } pack .tere Tk - aknaelemendid frame, toplevel - ristkülikud, millele võib anda värvi (background) ja reljeefsuse (relief). Kasutatakse tavaliselt muude elementide grupeerimiseks "konteinerina" (toplevel on sõltumatu paigutusega). Sündmustele ei reageeri. label - klassi frame omadustele lisandub võime sisaldada teksti (text, textvariable) või ikooni (bitmap) message - sarnane klassile label, aegunud Klasside frame, toplevel label ja message meetoditeks on configure ja cget button - klassi label omadustele lisandub võime reageerida hiiresündmustele. Nupuvajutusega (täpsemalt - nupu vabastamisega) võib siduda Tcl-käsu (command) checkbutton - valikunupp, mis on seotud Tcl-muutujaga (variable), millel on kaks olekut (onvalue, offvalue). Hiireklõps vahetab nupu oleku (side muutujaga kahepoolne). Tavalise nupu omadused säilivad (s.h. command) radiobutton - esinevad rühmana, näidates võimalikke alternatiive. Sama rühma nupud jagavad ühist muutujat (variable), kus iga nupu valikule vastab individuaalne väärtus (value). Side nuppude rühma ja ühise muutuja vahel on kahepoolne. Tavalise nupu omadused säilivad. menu - valikute tüübid: - command - käitub nagu button - checkbutton, radiobutton - nagu nimest näha - cascade - sarnane klassile menubutton, valikuks on kaskaad-alammenüü - separator - horisontaaljoon kujundamiseks Menüü aktiviseeritakse meetodiga post. menubutton - sarnane tavalisele nupule, kuid tegevuseks on mingi menüü (antakse -menu lipuga) aktiviseerimine (post). Menüüsid võib luua kolmes stiilis: - pull-down (menüüriba abil) - pop-up (hiirekursori juurde) - cascaded - avanev alammenüü listbox - aken üherealiste sõnede hulgast valimiseks. Tavaliselt seotud kerimisribaga (yscrollcommand, xscrollcommand), kuna elemente võib olla rohkem, kui aknasse mahub (vaadet juhitakse meetoditega yview ja xview) entry - aken kasutajalt sõnede lugemiseks. Pikkade sõnede kerimise võimalus (scan, meetod xview). Kasutaja saab teksti redigeerida. Teksti võib kahepoolselt siduda Tcl-muutujaga (textvariable) scrollbar - kerimisriba, mis on seotud mingi muu elemendiga ning juhib selle nähtavust (command). Meetodid set, get , ... text - sarnane klassile entry, kuid lubab mitmerealisi tekste. Teksti saab varustada järjehoidjatega (meetod mark) ja märgistega (tag) teksti formaatimiseks ning sidumiseks käskudega (saab luua "hüperteksti") canvas - aken graafiliste objektide (s.h. teksti) paigutamiseks, redigeerimiseks, sidumiseks käskudega ("hüpergraafika") jne. Komplitseeritud klass - palju võimalusi scale - skaala arvmuutuja väärtustamiseks Tk - elementide konfigureerimine klassinimi elemnimi ?-param väärtus ...? Algväärtused saab anda elemendi loomisel, käsu tulemuseks on loodud elemendi nimi elemnimi configure Tagastatakse nimistu, mille iga element on alamnimistu ühe parameetri kirjeldusega elemnimi cget -param Tagastatakse nimistu antud parameetri kirjeldusega: parameetri nimi, vastava elemendi nimi ressursside andmebaasis, klassinimi, vaikimisi väärtus, väärtus. elemnimi configure -param väärtus ... Parameetri väärtuse muutmine option readfile failinimi ?prioriteet? Lugeda ressurside andmebaas antud failist (vt. .Xdefaults). Loetud kirjetele saab omistada prioriteedi (0 - 100) option clear - ressursside baasi taaslugemine option get elem nimi klass - baasist lugemine, tulemuseks väärtus või tühisõne option add näidis väärtus ?prioriteet? - kirj. Tk - konfiguratsiooni-parameetreid Kirjad, värvid, pildid - klassikalised X-ressursid määratakse tavalisel viisil (näit. värvid RGB-skaalas: #f00 - punane, ... ) Mõõtühikuks on vaikimisi piksel, lubatud on arvu lõppu kirjutada : c (sentimeeter), i (toll), m (millimeeter) ning p (1/72") -relief on: raised, flat, sunken, ridge, groove Sisseehitatud pildid (bitmaps): error, info, question, hourglass, warning, ... -anchor : seotud kirja, pildi vms. paigutamisega aknaelemendile. Väärtused: n ne e se s sw w nw center Alati saab kasutada parameetreid: -width -height -relief -background -borderwidth ... Sageli saab veel: -geometry -foreground -font -text -textvariable -bitmap -anchor -padx -pady -cursor -command -state -activebackground -activeforeground -disabledforeground -highlight... Eriti olulised on:-command -xscrollcommand -yscrollcommand-variable -text -textvariable -value -state ... Tk - pildid image create photo nimi ?-param väärtus ... ? Formaadid: .ppm .pgm .gif image create bitmap nimi ?-param väärtus ...? X11 bitmap Parameetriga -file failinimi saab lugeda failist Loodud pilti saab kasutada korduvalt, muuta, jne. Tüüpiliselt kasutatakse elementides, mis lubavad image-parameetrit kujul: -image nimi image names Väärtuseks on nimistu defineeritud piltide nimedest image types nimistu lubatud formaatidest image type nimi Väärtuseks on antud pildi formaat image width nimi image height nimi image delete nimi kustutada Tk - paigutushaldur pack pack ?configure? elemnimi ?elemnimi ...? ? -param väärtus ... ? Paigutada antud elemendid ekraanile pack forget elemnimi Eemaldada element ekraanilt pack info elemnimi Tulemuseks nimistu paigutusparameetritest (paaridena param väärtus) või tühisõne pack slaves elemnimi Tulemuseks nimistu antud elemendi paigutamist vajavatest alluvatest (packing list) Parameetreid: -side top bottom left right -anchor n ne e se s sw w nw center -after elemnimi -before elemnimi -in elem -fill none x y both -expand true false -padx kaugus -pady kaugus -ipadx kaugus -ipady kaugus Tk - sündmuste sidumine Seosmarker (binding tag) võimaldab anda käitumise konkreetsele aknaelemendile, elementide klassile, toplevel-aknale või kõigile akendele Seosmarkeri nimi on kas elemnimi, klassinimi, toplevel_akna_nimi või all Näit: .b Button . all bind nimi sündm-ahel prog Siduda antud markeriga määratud elementide piires toimuv X-sündmuste ahel Tcl-programmiga. Sündmustega seotud programmid töötavad alati globaaltaseme kontekstis bind nimi sündm-ahel +prog Kui seos on juba olemas, siis lisada antud programm olemasoleva lõppu, vastasel juhul luua uus seos bind nimi sündm-ahel Tulemuseks ahelaga seotud Tcl-programm, kui vastav seos on olemas või tühisõne bind nimi Tulemuseks nimistu kõigist sündmuste ahelatest, mille jaoks antud markeril on defineeritud seos bindtags elemnimi markerinimistu Määrata, millised markerid ning millises järjekorras antud elemendi jaoks toimivad Näit: bindtags .b { .b MyButton all } Vaikimisi oleks: { .b Button . all } Klaviatuurisündmused toimuvad ainult juhul, kui element on sisestusfookuses. tkerror veateade Kasutajaprotseduur vigade töötlemiseks Tk - X sündmuste ahelad Iga sündmus ahelas on üldkujul: < ?modifikaator ... - ? tüüp ?- detailid? > Näit: (keskmise hiirenupu vabastamine, kui hoitakse Control- ja Shift-klahve) Lubatud mitmesugused lühendamised Modifikaatorid: Any Control Shift Lock Meta (M Mod1 M1) Alt (Mod2 M2) Mod3 (M3) Mod4 (M4) Mod5 (M5) Button1 (B1 1) kuni Button5 (B5 5) Double Triple Tüübid: Button (ButtonPress) ButtonRelease Motion Enter Leave FocusIn FocusOut Configure Map Unmap Destroy ... KeyPress (Key) KeyRelease Detailid: hiirenupu number ( 1 kuni 5 ), klahvide sümbolnimed: Return Escape space BackSpace Tab Up Down Left Right Next Prior Home End Insert Delete F1 F2 ... Ahelas võib olla palju sündmusi, kuid ahela seosed tuleb programmeerida arvestusega, et lühema ahelaga seotud programm täidetakse samuti. Näit. sisestuvus: Tk - sündmus-asendused Lisaks Tcl asendustele $ [ ] \ on Tk programmide jaoks %-asendus (ei allu Tcl asendusreeglitele, nagu { } \ ): %% - tavalise protsendimärgi saamiseks %x - sündmuse x-koordinaat (suhteline) %y - sündmuse y-koordinaat (suhteline) %X - sündmuse x-koordinaat juuraknas %Y - sündmuse y-koordinaat juuraknas %W - elemendi nimi, milles sündmus toimus %A - sümbol klaviatuurisündmuselt %k - klahvikood (keycode) - " - %K - klahvinimi (keysym) - " - %b - nupu number hiiresündmuselt %f - fookus (0 või 1) Näit. Hiire jälgimine bind all { puts "Sisenesin %W" } bind all { puts "Lahkusin %W" } bind all \ { puts "Koord: ( %x , %y )" } Tk - valik (selection) Tk toetab X-windows objektide valikut - PRIMARY, CLIPBOARD, ... (täpsem info ICCCM dokumentatsioonis) informatsiooni edastamiseks rakenduste vahel ning operatsioonideks valitud objektidega (näiteks cut, paste, copy, delete, ...) Valiku tüübiks on vaikimisi STRING (muud vt. ICCCM: FILE_NAME LINE POSTSCRIPT ...) ja formaadiks STRING (veel ATOM, INTEGER, ...) Valimise moodus kasutaja jaoks sõltub töötlevast programmist ja aknaelemendi klassist - programmeerijal on käsud valikuga opereerimiseks antud klassis: Näit. .lb selection set 0 .cnv select clear set a [selection get] selection own ?-displayof aken? ?-selection valik? Annab elemendi nime, millele kuulub (antud akent kuvaval X-displeil) antud valik (vaikimisi PRIMARY) selection own ?-selection valik? ?-command programm? elemnimi Kuulutab antud valiku omanikuks antud elemendi (eelmine valik tühistatakse). Kui on määratud ka programm, siis see täidetakse, kui antud element muutub mittevalituks selection clear ?-displayof aken? ?-selection valik? Tühistab antud valiku (vaikimisi PRIMARY) antud akent kuvaval X-displeil selection get ?-displayof aken? ?-selection valik? ?-type tüüp? Tulemuseks antud valik (vaikimisi PRIMARY) antud akent kuvaval X-displeil (tüübiks on vaikimisi STRING) Tk - klaviatuurifookus ja tegevuste piiramine focus -lastfor toplevel Tagastab elemendi nime antud juurtaseme aknas, kus viimati asus sisestusfookus focus ?-force? elemnimi Määrab klaviatuurifookuse antud elemendile focus ?-displayof elemnimi? Tagastab akna nime, milles asub fookus (vajadusel saab määrata X-displei) Hiirekursori saab kuulutada ainult antud elemendile kuuluvaks (NB! jälgida, et kitsendus kehtiks ainult ainult niikauaks, kui see on tõesti hädavajalik) - grab grab ?set? ?-global? elemnimi Antud rakenduse hiiresündmused (-global korral kõik hiiresündmused) suunatakse antud elemendile (ja tema alluvatale) grab release elemnimi grab set abil seatud kitsenduse kaotamine grab status elemnimi Tagastab local, global või none Tk - tegevuste piiramine, mitmesugust grab current ?elemnimi? Tagastab piiratud elemendi nime antud elemendi alampuus või tühisõne, kui sellist pole. Ilma argumendita tagastab nimistu kõigist piiratud elementidest tkwait variable muutuja Ootab antud gl.muutuja väärtuse muutumist tkwait visibility elemnimi Ootab antud elemendi muutumist tkwait window elemnimi Ootab antud elemendi kadumist destroy elemnimi ?elemnimi ...? Eemaldada antud elemendid after millisekundid ?Tcl-prog? Paus antud arv millisekundeid winfo exists elemnimi Kas antud element on defineeritud (1 või 0) winfo children elemnimi Nimistu antud elemendi vahetutest alluvatest Tk - send, wm send ?-async? rakendus argum ?argum ...? Argumendid ühendatakse Tcl-programmiks ning see programm täidetakse antud rakenduse keskkonnas. Tulemuseks programmi töö tulemus. Rakenduse nimeks on wish, selle poole pöördunud shell-programmi nimi vms. winfo interps Nimistu kõigi hetkel eksisteerivate rakenduste nimedest (send-käsu jaoks) tk appname ?uusnimi? rakenduse nimi wm title nimi sõne pealkiri antud aknale wm geometry nimi paigutus Paigutus antud aknale (vt. X geometry) wm maxsize nimi laius kõrgus wm minsize nimi laius kõrgus wm iconify nimi wm deiconify nimi wm withdraw nimi mitte kuvada wm state nimi - normal iconic withdrawn Näide. #!/bin/sh # Restart using wish \ exec wish "$0" "$@" # # Kataloogide puu la"bimine * Jaanus Po"ial * 28.11.1994 # Kataloogi valimisel tuuakse kataloogi nimi sisestusva"ljale ning # sisu nimekirja-aknasse, faili valimisel tuuakse faili nimi # sisestusva"ljale. Sisestusva"lja saab redigeerida, nimekirja-aknal # on kerimisriba. Arusaamatud nimed po'hjustavad vea. entry .sisest -relief sunken ; # Sisestusva"li pack .sisest -side top -fill x ; # Paigutame ko'ige peale listbox .nimekiri -yscrollcommand ".keri set" \ -relief raised -width 20 -height 20 \ -selectmode single pack .nimekiri -side left \ -fill both -expand true; # Aken failinimede jaoks vasakul e scrollbar .keri -command ".nimekiri yview" pack .keri -side right -fill y ; # Aknale kerimisriba kylge proc tootle { toofail } { # Po'hiprotseduur antud faili/katal. jaoks if [ file isdirectory $toofail ] { cd $toofail .sisest delete 0 end .sisest insert end [ pwd ] .nimekiri delete 0 end foreach i [ lsort [ glob -nocomplain .* * ] ] { .nimekiri insert end $i } } elseif [ file isfile $toofail ] { # Tavaliste failide to"o"tlem. .sisest delete 0 end .sisest insert end "[ pwd ]/[ file tail $toofail ]" } else { # muud juhud error "$toofail: Ei oska to'o'delda" } if { [ .nimekiri curselection ] == "" } { .nimekiri see 0 .nimekiri selection set 0 } } wm title . "Lehitseja" focus .nimekiri tootle "." ; # Programmi to"o" algus - jooksvast kataloogist bind .nimekiri { tootle [ selection get ] } bind .sisest { tootle [ .sisest get ] ; focus .nimekiri } bind .sisest { .sisest delete 0 end } bind .nimekiri { destroy . } bind .nimekiri { .nimekiri selection clear 0 end .nimekiri selection set active tootle [ selection get ] } # ==========================================================lopp