KATSAUS TCL/TK- KIELEEN
OSA: TK (Tool Kit)


Ohjelmistotekniikan seminaari 

Joni Erikslund: jper@kanto.jyu.fi 






SISÄLLYSLUETTELO: 









1. YLEINEN KATSAUS GRAAFISEEN TK-KIELEEN 

Tk (Toolkit) on työkalu, jonka avulla voidaan muodostaa graafisia sovelluksia X11-systeemiin Tcl-skriptien avulla. Kuten Tcl (Tool Command Language), Tk on C-kirjastokokonaisuus, joka voidaan sisällyttää C++-ohjelmiin. Tk laajentaa Tcl-komentojen kokoamisvalikkoa. Käyttäjä voi käyttää komentoja muodostamaan käyttöympäristöelementtejä. Näitä komentoja kutsutaan yleisellä nimityksellä ohjain (widget). Esim. näillä voidaan tehdä mielenkiintoisia geometriakokonaisuuksia näytölle eri tavoin siten, että ne toimivat saumattomasti yhdessä. 

Tcl-komentojen lisäksi Tk sisältää myös kokoelman C-kirjastofunktioita, joita voidaan kutsua C-koodista. Kirjastofunktiot antavat mahdollisuuden toteuttaa uusia ohjaimia ja geometriakokonaisuuksia C-ohjelmiin. 

Esittelen tässä vaiheessa Tk:sta vain perusrungon, jonka avulla voidaan muodostaa kokonaiskuva Tk:n käyttäytymisestä ja mahdollisuuksista. Tcl:stä ilmestyy vuoden alusta uusi versio 7.7 ja Tk:sta versio 4.3, joten jo nyt osa käsittelemästäni aineistosta saattaa olla vanhaa tai muokattua. Uusimmat tiedot Tcl/Tk:sta saa osoitteesta http://www.sunlabs.com, josta voi myös kysyä tietoa ongelmista ja niiden ratkaisuista. Parhaimmat vastaukset saadaan itse tekijöiltä, joten kysymykset kannattaa lähettää joko John Ousterhoutille tai Greg Welchille. 


2. OHJAIMET JA IKKUNAT 

Peruskäyttöliittymäelementtejä kutsutaan Tk:ssa widgeteiksi eli ohjaimiksi. Tyypillisiä ohjaimia ovat otsikot, painikkeet, vedettävät menut, palkit ja hypertekstit. Ohjaimet ovat ryhmitelty luokkiin, jossa kaikilla ohjaimilla on samankaltainen ulkoasu, ja samankaltainen käyttäytyminen, kun niitä käsitellään hiirellä tai näppäimistöllä. Esimerkiksi painikeluokkaohjaimet (button class widgets) näyttävät tekstipalkin tai kuvion eri tavoin (esim. eri kirjasimin tai värein), mutta jokainen ohjain erikseen näyttää yksittäisen palkin tai kuvion. Ohjaimissa on näppäimistön lisäksi mahdollisuus käyttää myös hiirtä. Erilaiset näppäinohjaimet voivat sisällyttää myös eri komentoja itseensä, jonka lisäksi jokainen sisällyttää myös liitäntäkomennon. Kun muodostetaan ohjain, niin valitaan sen luokka ja luokkamääritys, kuten esim. palkki tai kuvio näyttämään/ kutsumaan käskyä. 

Tk:n sisäänrakennetut ohjainluokat toteuttavat MOTIFTMin "katso ja tunne" (look-and-feel) -standardia, jonka on kehittänyt Open Software Foundation. MOTIF-standardi määrittää kolmiulotteisen ulkoasun, joka näkyy Tk-ohjaimissa, ja moni aspekti itse niiden käyttäytymisessä. 

Jokainen ohjain on työväline yhdessä ikkunassa. Termit, ikkunat ja ohjaimet on toteutettu eri tasoisesti. Ohjaimet voivat sisällyttää eri tasoisia käyttäytymisiä eri ohjainten kanssa, jotka sisällyttävät taas toisia ohjaimia ja taas nämä voivat sisällyttää toisia jne. Kokonaisuus on kolmiulotteinen. Jokainen ohjain voi sisällyttää huomattavan määrän aliohjaimia ja ohjainpuu voi saada aivan minkälaisen ulottuvuuden tahansa. Ohjaimet käyttäytymisineen, jotka ovat merkityksellisiä käyttäjälle, ovat yleisesti poistumisia ohjainpuusta. Tällöin ylempitasoinen ohjain yleisesti vain sisällyttää käskykannan ohjaimesta poistumiseen. 

 

Kuva 1: Ohjaimet ja niiden hierarkia. 

Ohjaimet ovat sijoittuneet hierarkisesti. Kuvassa 1a) on esitetty kokoelma ohjaimia niin kuin ne ilmestyvät näytölle. Kuva 1b) on esitetty kokoelmasta hierarkinen muoto. Ylimmäinen ohjain (.) sisältää kolme jälkeläistä ja menu-palkki sisältää vielä kaksi omaa jälkeläistä. 


Jokainen ikkunaan liittyvä ohjain saa tekstimuotoisen nimen, jota käytetään viittaamaan Tcl-komentoihin. Ikkunanimet ovat samanlaisia "hierarkisiin jononimiin" verrattuna Unixissa, eroavaisuutena käytetään Tk:ssa pistettä (.). Nimi viittaa ylös suurimmassa osassa ikkunoita hierarkiassa, joita kutsutaan pääikkunoiksi. Nimet .a.b.c ovat ali-ikkunoita pääikkunassa. 

2.1 NELIÖ, ESIMERKKI OHJAIMISTA 

Yksinkertainen esimerkki ohjaimista on neliö. Tämä ohjain sisältää useita valintoja: kuten värin valinnan taustaksi ja neliöksi, ohjaimen vapautuksen, reunan paksuuden; ohjaimessa ja neliössä. Lisäksi neliö sisältää myös kolme ohjain -komentoa: configure, position ja size. Configure kyselee ja määrittelee perusasetukset, position määrittelee neliön ylävasemman kulman suhteutettuna ikkunan ylävasempaan kulmaan ja size määrittelee neliön koon. 

 

Kuva 2: Scriptit ja niiden graafinen esitys näytöllä.  



3. NÄYTÖT, SOMISTUKSET JA YLEMPITASOISET IKKUNAT 

Tk muodostaa halutun ohjelman pääikkunan kuten ali-ikkuna sen juurikkunan. Tämä aiheuttaa pääikkunan ilmestymisen näytölle. Ikkunaympäristö muodostaa tämän jälkeen kehyksen (decorative frame) pääikkunalle, joka yleisesti näyttää otsikon ja sisällyttää ohjaimet joita käytetään siirtämään tai muuntamaan ikkunan kokoa. Annettu ikkunamanageri muodostaa samalla tavoin somistukset (decorations), mutta eri ikkunamanagerit voivat myös käyttää eri tapoja somistuksille. 

 

Kuva 3: Ylempitasoiset ohjaimet. 


Ylempitasoiset ohjaimet näyttävät Tk-hierarkiassa samankaltaisilta kuin sisäiset ohjaimet. Ylempitasoiset ohjaimet ovat sijoittuneet itsenäisesti näytölle niiden pääikkunaan nähden. Ylhäällä olevassa kuvassa dialogilaatikko .dlg on ylempitasoinen ikkuna. Kuvassa on esitetty graafinen- ja hierarkinen esitys. 

X11-systeemi leikkaa jokaisen ikkunan alueen sen pääikkunasta (main window). Se ei siis näytä mitään ikkunan osaa joka on alueen ulkopuolella emoikkunasta. Emoikkunan jälkeläisiä kutsutaan sisäisiksi ikkunoiksi (internal windows), sillä ne ilmestyvät emoikkunan alueelle. Joka tapauksessa ohjelmat usein tarvitsevat ohjaimia, jotka eivät ole emoikkunan sisäpuolella. Esimerkiksi, voi olla hyödyllistä muodostaa dialogilaatikon paikka keskellä näyttöä kuitenkin emoikkunan osoittamaan paikkaan. Ohjelma voi myös haluta osoittaa useita paneeleita, joita käyttäjä voi siirtää ympäri näyttöä itsenäisesti. Tämänkaltaisissa tapauksissa Tk tuottaa ikkunoita, joita kutsutaan ylempitasoisiksi ikkunoiksi (top-level window). Ylempitasoinen ikkuna ilmestyy kuten sisäinen ikkuna ohjelman ohjainhierarkiaan. 


Ei ole tarpeellista kaikille ohjelman ohjaimille ilmestyä samaan näyttöön tai samalle ruudulle. Kun muodostetaan ylempitasoinen ohjain, voidaan määritellä näytön koko juuri sille. Näytön oletukset ohjaimelle on Tk:n hierarkiassa "emoohjain" (parent), mutta kuitenkin voidaan määritellä mikä tahansa näyttö, jonka X palvelin hyväksyy ohjelman yhteyteen. Esimerkiksi on mahdollista muodostaa Tk ohjelma, joka lähettää viestin työasemille kun ylempitasoinen ikkuna avataan yksittäisillä koneilla. 

Kun ohjain on luotu halutulle näytölle, niin sitä ei enää voi siirtää toiselle näytölle (tämä rajoitus X-ikkunasysteemissä). Kuitenkin, samankaltainen toiminto voidaan saavuttaa tuhoamalla ohjain ja uudelleenmuodostamalla ohjain eri näytölle. 


4. OHJELMAT JA PROSESSIT 

Tk:ssa termi ohjelma (application) viittaa yksittäiseen ohjaimen hierarkiaan (yksi emoikkuna ja monta siihen liittyvää sisäistä ja ylempitasoista ikkunaa), yksi Tcl-kääntäjä yhdistyy ohjainhierarkiaan ja kaikki käskyt välittyvät kääntäjän kautta. Jokainen ohjelma on yleisesti erillinen prosessi, mutta Tk antaa myös mahdollisuuden yksittäisen prosessin hoitaa useita ohjelmia. Myös prosessinsuoritus suorittaa jokaisen ohjelman omalla ohjainhierarkialla ja Tcl kääntäjällä. Tk ei välitä mitään erityistä tukea moniprosessille (multi-threading). On kuitenkin mahdollista, että Tk voi käyttää moniprosessiympäristöä tulevaisuudessa. 


5. SKRIPTIT JA TAPAUKSET(events) 

Tk-ohjelmat ovat kontroloituja kahdenlaisilla Tcl-skripteillä: alustusskriptillä (initialization scripts) ja tapauskäsittelijöillä (event handlers). Alustusskripti toteutetaan, kun ohjelma käynnistyy. Se muodostaa ohjelman käyttöympäristön, lataa ohjelman datakokonaisuuden ja suorittaa kirjautumisen tapaussilmukasta (event loop) odotukseen (käyttäjän keskeytykseen). Kun siirretään hiirtä tai valikosta kirjaudutaan jonnekin tekemään jotain, niin silloin suoriutuu jokin Tcl-skripti automaattisesti. Näitä skriptejä kutsutaan tapauskäsittelijöiksi. Ne voivat kutsua ohjelmamääriteltyjä Tcl-käskyjä (esimerkiksi siirtämään artikkeli tietokantaan), muuntaa käyttöympäristöä (esimerkiksi siirtää dialogilaatikon). Jotkut tapauskäsittelijät ovat muodostuneet alustusskriptien kautta, mutta tapauskäsittelijät voivat myös muodostua ja muuntautua muiden tapauskäsittelijöiden kautta. 

Suurinta osaa Tcl-koodista Tk-ohjelmissa on kutsuttu tapauskäsittelijöiden ja käskyjen kautta. Monimutkaiset ohjelmat sisältävät satoja tapauskäsitteljöitä ja käsittelijät voivat muodostaa muita paneeleita ja dialogeja, jotka myös sisältävät tapauskäsittelijöitä. Tk-ohjelmat ovat siten tapauskohtaisia (event-driven). Ohjelmat esittelevät käyttöympäristön monella tapaa ja käyttäjä päättää, mikä tekee mitäkin seuraavaksi. Jokaiset ohjelman täytyy siis vastata tapauskysymykseen käyttäjän käskyistä. Tapauskäsittelijät toteuttavat vastauksia, ne pyrkivät olemaan lyhyitä skriptejä ja ne ovat enimmäkseen toisistaan riippumattomia. 


6.WISH-IKKUNOINTIVALIKKO (windowing shell) 

Wish on yksinkertaisin Tk-ohjelma. Ainoat Tcl-komennot, joita wish sisältää ovat sisäänrakennetut Tcl-komennot ja muut Tk-välityskomennot. Jos wish-ohjelmassa kutsutaan ilman argumentteja, luo wish pääikkunan ja käyttäytyy kuten valikko (shell), lukien Tcl-komentoja standardista syötteestä ja toteuttaen ne. Esimerkiksi komennot  luovat wishissä yksittäisen napin, joka näyttää tekstin Hello, world . Se myös muodostaa yhden tapauskäsittelijän: jos käyttäjä napauttaa hiiren 1 näppäimellä ohjainta - tämän jälkeen Tk kutsuu käskyä destroy . , joka tuhoaa ohjelman pääikkunan ja sen kaikki ali-ikkunat ja sen jälkeen wish aiheuttaa ohjelmasta poistumisen. Wish vastaa tapauksiin ohjelmaikkunasta samoin kuin sellaisiin käskyihin, jotka on annettu sen perusstandardista syötteestä. 

Wish-ohjelmaa voi myös käyttää kutsumaan skriptejä, joita on tallennettu. Esimerkiksi voidaan luoda nimetty hello, joka sisältää yllä olleet käskyt. Jos käynnistetään wish ja kirjoitetaan  saadaan käynnistymään tallennettu tieto. Wishiä voidaan kutsua myös seuraavalla valikkokäskyllä  Tässä tapauksessa wish ei lue käskyä standardista syötteestä, vaan se tuhoaa skriptin, joka oli sisältänyt tallennetun hello:n ja sitten ohjelma siirtyy tapaus-silmukkaan, jossa se vastaa vain käskyihin, jotka tapahtuvat ohjelmaikkunoissa (application windows). 

Wish skriptejä voidaan myös kutsua käyttämällä samaa mekanismia, jota käytetään Unix-skripteissä. Tehtäessä tämä, annetaan seuraava kommentti ensimmäiselle hello -riville:  Sen jälkeen merkitään skripti toteutettavaksi. Nyt voidaan kutsua suoraan valikosta kuten mitä tahansa toteutettavaa ohjelmaa.  Tämä ajaa wishin ja suorittaa skriptin, kuten jos vaikka kirjoitettaisiin 
7. OHJAINTEN LUONTIKOMENNOT 

Tk:n Tcl-komennot kuuluvat neljään pääryhmään, jotka luovat ohjaimia, järjestävät ohjaimia näytölle, kommunikoivat jo olemassaolevien ohjaimien kanssa ja liittävät ohjaimia ohjelmien välille. 

Ohjain muodostetaan kutsumalla nimettyä käskyä ohjainluokan jälkeen eli nappia nappiohjaimista, vierintäpalkkia vierintäpalkkiojaimista ja niin edelleen. Esimerkiksi käsky :  luo napin joka näyttää tekstin Press me punaisella. 

Kaikilla ohjainkomennoilla on edellisentyylinen muoto. Käskyn nimi on sama kuin uuden ohjainluokan nimi. Ensimmäinen argumentti antaa nimen uudelle ohjaimelle ohjainhierarkiassa, .b tässä tapauksessa. Tätä ohjainta ei tarvitse olla aikaisemmin, mutta sen pääohjaimen (parent) täytyy löytyä. Käsky luo ohjaimen ja kutsuu X-ikkunaa. 

Ohjaimen nimi seuraa mitä tahansa parillista väitettä (pair argument). Siinä ensimmäisenä on jokaisen parin väite, joka määrittelee halutun valinnan ohjaimelle (esimerkiksi -text or -foreground) ja toinen argumentti määrittelee arvon tälle valinnalle (esimerkiksi Press me tai red). Jokaista ohjainluokkaa tukee monenlaisia vaihtoehtoja (options), mutta monet vaihtoehdot, kuten -foreground, käyttäytyvät samalla tavalla eri luokissa. Tällöin ei siis tarvitse määritellä arvoa jokaiselle vaihtoehdolle, vaan oletukset valitaan vaihtoehdoista, joita ei yksilöidä. Esimerkiksi, napit tuetaan kahdellakymmenellä eri vaihtoehdolla, mutta vain kaksi yksilöidään jäljempänä olevassa esimerkissä. 


8. GEOMETRIAMANAGERI 

Ohjaimet eivät päätä omista kokoluokistaan, eivätkä paikoistaan näytöllä. Tämän toiminnon hoitaa geometrimanagerit (geometry managers). Geometriamanagerin tehtävänä on suhteuttaa ja sijoittaa yksi tai useampi orjaikkuna pääikkunaan. Jokaisella geometriamanagerilla on tietyt ulkoasutyylit. Tk on siten samanlainen kuin muut X11-työkalut eli Tk ei anna yksittäisen ohjaimen määrätä omaa geometriaansa. Esimerkiksi jos käsketään geometriamanageri asettamaan ohjain pystysuoralle palstalle. Tällöin ohjaimen paikka muuttuu siten, että tämä ohjain ja joku toinen ovat vierekkäin, mutta eivät päällekkäin. Jos yksi ohjain tarvitsee yllättäen lisää tilaa (esim. kirjasin muuttuu suuremmaksi), se varaa oikean palstan koon vaadittavalle tilalle. 

 

Kuva 4: Geometriamanagerin toimintakaavio. 
 

Geometriamanagerit saavat kolmenlaisia viestejä: jokaisen orjaikkunan vaaditun koon, käskyt ohjelmasuunnittelijalta (esim. muokkaa nämä kolme ikkunaa palstalle) ja pääikkunan oikean geometrian. Tämän jälkeen geometriamanageri määrittelee ikkunan koon ja paikan jokaiselle orjaikkunalle. Geometriamanageri voi myös asettaa pääikkunalle vaaditun koon, jota voidaan käyttää ylempitasoisilla geometriamanagereilla määräämään pääikkunan koon. 


8.1 PAIKKAMANAGERI 

Paikkamanageri (placer) on yksinkertainen geometriamanageri, joka esittää määrätyn paikan ikkunalle. Ohjelmasunnittelija määrittää suhteellisen paikan paikan ja koon jokaiselle orjaikkunalle ja paikkamanageri esittää vaaditun paikan. Paikkamanageri muuttaa jokaisen orjaikkunan itsenäisesti. Jos siis yhden orjaikkunan paikkaa muutetaan, niin muut ikkunat eivät samalla saa muutosohjeita. Place -käskyä käytetään kommunikoimaan placerin kanssa. Esimerkiksi  sijoittaa ikkunan .x siten, että orjaikkunan vasen yläkulma piirtyy pääikkun vasemman yläkulman kanssa samaan paikkaan. 

place window option value ?option value ...?  -sama kuin place configure-käsky alapuolella 
place configure window option value ?option value ...?  -järjestää placerin käsittelemään ikkunan geometriaa, 
-option ja value määrittää ikkunan koon ja paikan 
place forget window  -lopettaa placerin ikkunan käsittelyn ja poistaa ikkunan näytöltä 
-ei vaikutusta ikkunaan, jos placer ei käytä ikkunaa 
place info window  -palauttaa ikkunan sen hetkisen rakenteen 
-lista sisältää option value-pareja täsmälleen samassa muodossa, kuin place configure -käskyllä määritettäessä 
-palauttaa tyhjän ikkunan, jos placer ei käytä ikkunaa 
place dependents window  -palauttaa orjaikkunoiden listan, joita placer käsittelee window-pääikkunassa 

Taulukko1. Kokoelma placer-käskyistä. 


 

 

Kuva 5: Esimerkkejä Placerin käyttäytymisestä. 



8.2 PAKKAAJAMANAGERI 

Toista geometriamanageria kutsutaan pakkaajamanageriksi (packer). Se on constrain-pohjainen ja toteuttaa järjestelyt kuten palstan. Pakkaajamanageri on monimutkaisempi kuin paikkamanageri. Sitä on tehokkaampi käyttää kuin paikkamanageria, koska se voi muuttaa orjaikkunoita yhdessä ryhmässä (packing list). Pakkaajamanageri sisältää listan kaikista pääikkunassa määritellyistä orjaikkunoista ja suorittaa listan orjaikkunoiden määritykset järjestyksessä. 

pack window ?window ...? option value ?option value ...?  -sama kuin pack configure-käskyssä alapuolella 
pack configure window ?window ...? option value ?option value  ...?  -mahdollistaa packerin käsitellä ikkunoiden geometriaa 
-option ja value ilmoittavat ikkunoiden sijainnin ja koon 
pack forget window  -lopettaa packerin ikkunan käsittelyn 
-poistaa ikkunan näytöltä 
-ei vaikutusta, jos ikkunoita ei käsitellä packerilla ->tällöin palauttaa tyhjän arvon 
pack info window  -palauttaa ikkunan rakenteesta listan, sisältäen option value -pareja samassa muodossa kuin pack configure -käskyllä määritettynä 
pack slaves window  -palauttaa pääikkunan pakkauslistan orjaikkunoista järjestyksessä 

    Taulukko2. Kokoelma packerin käskyistä. 



 

Kuva 6: Esimerkki Packerin käyttäytymisestä yksittäisessä orjaikkunassa. 


Ylläolevassa kuvassa ensimmäinen vaihe näyttää orjaikkuna ennen pakkausta. Osa pääikkunoista on allokoitu edellisiltä orjaikkunoilta. Toisessa vaiheessa Packer määrittelee kehyksen orjaikkunalle pääikkunan vapaasta alueesta. Kolmannessa vaiheessa Packeri sijoittaa orjaikkunan varattuun alueeseen ja neljännessä vaiheessa nähdään pääikkunalle jäävä tyhjä alue mahdolliselle seuraavalle orjaikkunalle.  


Yksinkertaisia esimerkkejä pakkaajamanagereista:  Pakkaajamanageria käytetään usein myös hierarkisiin toimenpiteisiin. Yksinkertaisuudessaan se tarkoittaa, että orjaikkunat ovat toisille orjaikkunoille pääikkunoita. 

8.3 MUITA GEOMETRIAMANAGEREITA 

Muita geometriamanagereita ovat canvas ja textwidget. Grafiikkamanagerin (canvas) avulla voidaan seikoittaa ohjaimiin rakenteellista grafiikkaa ja tekstimanagerilla (text widget) voidaan sijoittaa ohjaimia tekstin kanssa. 

Kun suoritetaan ohjaintoteutuskäskyjä, kuten button, uusi ohjain ei heti ilmesty näytölle. Se näytetään vasta sitten, kun geometrimanageria käsketään ajamaan ohjain. Jos halutaan kokeilla ohjaimia ennen kuin toteutetaan koko käskykanta geometriamanagerista, niin voidaan ohjain näyttää pack-komennolla ohjaimen nimen kanssa. 

Esimerkiksi skripti  luo painikeohjaimen ja näyttää sen ruudulla. 

Tamä muokkaa pääikkunan niin suureksi, että painike sopii ikkunalle. Se myös asettaa painikkeen siten, että pääikkunan tila sopii näytölle. Jos suoritetaan toinen ohjain ja pakataan ne samalla tavoin, pakkaajamanageri asettaa ne palstan sisään pääikkunalle ja tekee pääikkunan juuri niin suureksi kuin nämä molemmat edelliset ovat vaatineet. 
9. OHJAINKOMENNOT 

Kun Tk:ssa luodaan uusi ohjain, niin Tcl myös luo uuden komennon, jonka nimi on sama kuin ohjaimen nimi. Tätä komentoa kutsutaan ohjainkäskyksi (widget command).Kaikki ohjainkomennot (yksi jokaisella widget-ohjelmalla) muodostavat kolmannneksi suurimman ryhmän Tk:n käskyistä. 

Ohjainkäskyjä käytetään kommunikoimaan jo olemassaolevien ohjaimien kanssa. Seuraavat käskyt voidaan toteuttaa button -käskyn jälkeen. 
Ensimmäinen käsky muuttaa napin värin siniseksi, toinen käsky aiheuttaa napin vilkkumisen. Kolmas käsky toteuttaa napin vain jos käyttäjä on painanut hiiren nappia 1 (normaalisti vasen näppäin). Ohjain-käskyissä käskyn nimi on samaa muotoa kuten configure. Jotkut ohjainkäskyt, kuten configure, vaativat ylimääräisiä argumentteja; näiden argumenttien luonne riippuu määrätystä käskystä. 

Osa ohjainkäskyistä toteuttaa saman osan käskyistä, joita voidaan käyttää kutsumaan ja muuttamaan mitä tahansa vaihtoehtoja ohjaimissa. 


10. KÄSKYT YHTEENLIITTYMÄLLE 

Neljännen pääryhmän Tk-käskyt hoitavat prosessien yhteenliittämisen (interconnection). Näitä käskyjä käytetään suoriutumaan tehtävistä, joissa ohjaimilla on ohjelmassa paljon erilaista grafiikkaa. Esimerkiksi monet ohjelmat voivat jakaa saman näytön useammalle eri prosessille yhtä aikaa. 

Jotkut yhteenliittymäkäskyt toteuttavat ja toteutuvat kuten tapahtumakäsittelijät (event handlers). Kuten esim. jokaisella näppäimellä on -command -valinta, joka määrittelee Tcl-skriptin. Tämä toteutuu, kun esim. hiiren 1 näppäintä (normaalisti vasen näppäin) painetaan kursorin ollessa ikkunan päällä. Myös vierintäpalkkien tapauksessa napin painallus kohteen päällä lukee Tcl-skriptin. Jokainen vierintäpalkki on tehty näyttämään myös jotain toista ohjainta, kun ohjainta painetaan vierintäpalkissa tai vedetään liu'uttajasta. Tämän Tcl-käskyn tulisi aina toteutua, kun vierintäpalkin liu'uttajaa käsitellään. Tämän lisäksi voidaan muodostaa omia tapahtumakäsittelijöitä käyttämään bind-komentoa. 

Tk tukee myös viittä muuta yhteenliittämismuotoa tapauskäsittelijöiden lisäksi, joita ovat: selection(valinta), input focus, window manager(ikkunamanageri), send -käsky ja grabs (tarttujat). 

10.1 SIDOKSET 

Bind-komentoa on käytetty muodostamaan, muokkaamaan, kyselemään ja siirtämään sidoksia. Sidoksia voidaan muodostaa käskyn  avulla.

bind windowSpec sequence script  järjestää scriptin suorittamaan jokaisella kerralla skriptin  tapausjärjestyksen sequencen antamana, joka ilmestyy näytölle windowsSpecin antamana. Jos  windowsSpec ja sequence on sidottu => uudelleen sijoitus. Jos skripti on tyhjä, niin windowSpec - sequence sidokset poistetaan. 
bind windowSpec sequence +script  Jos windowSpecin ja sequencen sidokset ovat jo olemassa, silloin ilmaantuu script- käsky nykyiseen sidokseen. Muuten muodostuu uusi sidos. 
bind windowSpec sequence  Jos windowsSpecin ja sequencen ovat jo olemassa palautetaan niiden skriptit. Muuten palautetaan tyhjät arvot. 
bind windowSpec  Palauttaa listan kaikkien windowSpec sidosten järjestyksestä 
tkerror message  Tk kutsuu, kun Tcl ilmoittaa virheen tapauskäsittelijässä, kuten sidos. Message Tcl:n palauttama virheilmoitus. Mikä muu tkerror- virhe tahansa hylätään. 

Taulukko3. Yhteenveto bind- ja tkerror-käskyistä.  

Ensimmäisen käskyn (edellinen esimerkki) ensimmäinen argumentti määrittelee ikkunan hakemistopolun, johon sidos osoittaa. Se voi olla myös ohjainluokan nimi, jolloin sidos osoittaa kaikkiin sen luokan ohjaimiin (kuten sidokset nimeltä class bindings). Toinen argumentti määrittelee yhden tai useamman tapauksen järjestyksen. Esimerkiksi yksittäisen tapauksen, joka on d-näppäimen painallus Ctrl-näppäimen ollessa pohjassa. Kolmas argumentti voi olla mikä tahansa Tcl-skripti. Esimerkin .entry-ohjain toteuttaa skriptin jokaisen merkin painalluksen jälkeen. 

10.2 VALINTA 

Valinta (selection) on mekanismi, jolla saadaan siirrettyä tietoa ohjaimien ja ohjelmien välillä. Ensin käyttäjä valitsee yhden tai useamman objektin ohjaimessa, esim. valitsee tekstialueen tai painaa jotain kuvaa. Kun valinta on tehty, käyttäjä voi kysyä muilta ohjaimilta haluttua tietoa, kuten tiettyä määrää merkkejä tai ohjaimen nimeä, joka sisältää kyseisen tiedon. Valintamekanismia käytetään useimmiten merkitsemään pysähtymistä tietylle riville. 

selection clear window  Jos näytöllä on missä tahansa selection, niin mikään muu ikkuna ei omista selectionia enää. 
selection get ?target?  Yrittää uudelleen saada ensisijaisen selection arvon käyttämään targetia lomakkeena, ja palauttaa selection arvon tuloksena. Target olettaa arvon. 
selection handle windows script ?target? ?format?  Luo selectionin vaatiman käsittelijän, kuten tabulaattorin muodostuksen silloin, kun ensisijainen selection on aktiivisena toisen yriittäessä käyttää sitä lomakkeena. Target olettaa arvon, format määrittelee uudelleen muodostuksen selection lähetykselle vaadittaessa, format olettaa arvon. 
selection own ?window? ?script?  Vaatii selectionin omistusuhteen ikkunalle. Jos joku toinen ikkuna aikaisemmin omistaa selectionin, lopettaa vanhan selectionin. Jos skripti on määritelty, silloin selection järjestetään uudelleen, kun ikkunaa ei ole valittu. Jos ei ikkunaa ja skriptiä ole määritetty, niin käsky palauttaa ikkunan polun nimen, jonka selection omistaa, tai ikkunan tyhjän arvon, jos mikään ikkuna ei omista selectionia. 

Taulukko 4. Yhteenveto selection-käskyistä.  

Käsky selection get palauttaa valinnan. Kohde voi olla määritelty ekxplisiittisesti tai sitä ei ole määritelty, jolloin oletuksena on alkuperäinen valinta (string). Seuraavassa tapauksessa prosessi palauttaa valinnan postscript-muodossa, muuten valinta palaa muuttumattomana alkuun. 
10.3 INPUT FOCUS 

Ohjelmaikkunalla tarkoitetaan input focus -ikkunaa tai lyhyesti focus-ikkunaa. Focus-ikkuna määrää vain mitä tapahtuu, kun näppäinlyöntejä esiintyy ohjelmassa. Se ei määrää, mitkä ohjelmat vastaanottavat näppäinlyöntejä näytöllä, vaan mitkä ikkunat ovat aktiivisia kulloinkin. 

On kahdenlaisia input focus-malleja. 

implicit = ehdoton malli focus seuraa hiirtä. Näppäinaktiivisuus on suunnattu sille ikkunalle, jolle hiirikursori osoittaa ja focus-ikkuna muuttuu aina, kun hiiri liikkuu ikkunasta toiseen. 

explicit = ehdollinen malli focus ikkuna on asetettu ehdollisesti ja se ei muutu vasta kun se on edellisestä tyhjennetty. Siis ikkuna ei muutu esim. hiiren mukana aktiiviseksi. 

focus  Palauttaa focus-ikkunan polun nimen tai tyhjän arvon, jos fokus-ikkunaa ei ole 
focus window  Asettaa ohjelman focus-ikkunan ikkunalle 
focus default ?window?  Jos ikkuna on määritelty, niin focus-ikkuna tulee oletukseksi, joka lähetetään input focusiin, milloin focus-ikkuna tuhotaan. jos ikkunaa ei ole määritelty niin oletus focus- ikkunaa ei ole. 
focus none  Tyhjentää focus- ikkunan 

Taulukko 5. Yhteenveto focus-käskyistä. 


10.4 IKKUNAMANAGERIT 

Jokaisella näytöllä X-window systeemissä on erityinen prosessi nimeltä ikkunamanageri. Ikkunamanageri on erillinen X-display serveristä ja ohjelmista, jotka ohjaavat näyttöä. Ikkunamanagerin pääasiallinen tehtävä on järjestää ylempitasoisten ikkunoiden näytöt oikeiksi. 

Ikkunamanagerit ovat tässä tapauksessa samanlaisia kuin geometriamanagerit. Niiden erotuksena on vain se, että geometriamanagerit hoitivat sisäisiä ikkunoita ja ikkunamanagerit ylempitasoisia ikkunoita kaikissa ohjelmissa. Tämän lisäksi ikkunamanagerit pystyvät  10.5 SEND -KOMENTO 

Send-komentoa käytettäessä yksinkertaisesti annetaan ohjelman nimi ja toteutettava Tcl-skripti muodossa   Ensimmäinen argumentti send-käskyssä on kohdeohjelman nimi ja toinen argumentti on Tcl-skripti, joka toteuttaa kyseisen ohjelman. Tk määrittää kohdeohjelman, toteuttaa Tcl-skriptin ja lähettää sen kääntäjälle. Tässä tapauksessa skripti asettaa pysäytyskomennon tietylle rivílle ja tiettyyn paikkaan. Send ei valmistu, ennenkuin koko skripti on suoritettu kohdeohjelmassa ja tulos on palautettu. 

send appName arg ?arg ...?  Sisältää kaikki arg-käskyt joissa on erottelijoita. Sen jälkeen muodostaa loppuskriptin ohjelmakääntäjälle, jonka on antanut appName. Tämän järjestyksen tulos palautetaan send käskyn tuloksena. 
winfo interps  Palauttaa listan, joiden ohjelmanimien kentät ovat vapaana näytöllä sisältäen pääikkunaohjelman 
winfo name  Palauttaa nykyisen ohjelman nimen. Sopiva käytettäväksi send-käskyllä koskien muita ohjelmia. 

Taulukko 6. Yhteenveto send-käskystä ja siihen liittyvistä käskyistä. 

10.6 TARTTUJAT 

Napinpainallukset hiirellä ja hiiren liike suoritetaan normaalisti hiirikursorin alla. Kuitenkin, ikkunan on mahdollista kieltää hiirenkäyttö ja antaa vain käyttöoikeuden tietylle pääikkunalle ja sen ali-ikkunoille. Tätä toimintaa kutsutaan nimellä tarttuja (grab). Kun hiiri on yhdessä ikkunassa grab alipuussa, hiiri toimii kuin tarttujaa ei olisi toiminnassa. Kun hiiri on tarttujapuun ulkopuolella, niin hiiren painallukset ja liikkeet siirretään tarttujaikkunaan. Siten poistumiset ikkunasta ja ikkunan lopetukset eivät ole mahdollisia. 

grab ?-global? window  Sama kuin grab set - käsky alapuolella 
grab current ?window?  Palauttaa nykyisen grab ikkunan nimen näytölle tai tyhjän arvon jos grabiä ei näytöllä. 
grab release window  Vapauttaa grabin ikkunassa jos on olemassa 
grap set ?-global? Window  Asettaa grabin ikkunalle vapauttaen edelliset grabit näytöltä. Jos -global on määritelty on grab globaalinen, muuten paikallinen. 
grap status window  Palauttaa tyhjän jos ei grabiä ole näkyvillä paikallisena, jos local grab on asetettu. Vastaavasti globaalisena jos global on asetettu 
tkwait variable varName  Odottaa kunnes variable varName muuttaa arvoaan 
tkwait visibility window  Odottaa kunnes näkyvillä olevan ikkunan tila muuttuu 
tkwait window window  Odottaa kunnes ikkuna on tuhottu 

Taulukko 7. Yhteenveto grab ja tkwait-käskyistä. 

Grab -käsky asettaa ja suorittaa tarttujia. Tk sisältää sekä paikallisia (locals), että yleisiä (globals) tarttujia. Paikallinen tarttuja nimensä mukaisesti vaikuttaa vain sille määrätyssä ohjelmassa (grabbing application). Jos hiiri viedään toiseen ikkunaan, niin toiminta on alkuperäisen mukaista. Yleensä kannattaa käyttää paikallisia tarttujia, jolloin oletukset asetetaan komennolla grab set. Yleinen tarttuja vaikuttaa koko näytössä, joten silloin ei voi vaikuttaa kuin tarttujan asetetulle alalle. Vaadittaessa yleistä tarttujaa asetetaan se vaikka seuraavasti:  Yleisiä tarttujia käytetään harvoin ja niitä on hankala käyttää (esim. unohdettaessa vapauttaa tarttuja näytöstä tulee epävakaa ts. käyttökelvottomaksi). 


11. MITEN MUODOSTAA IKKUNOINTI? 

Esittelen tässä vaiheessa perusprosessit muodostaa windows Tk:ssa. Kappaleessa esitellään Tk_Window-tyyppi, jota käytetään windowsin osoitteena, sitten esittelen lyhyesti Tk:n windowsin luomis ja tuhoamiskomennot. Tk sisältää myös useita makroja, joilla siirretään informaatiota windowsin välillä. Esimerkkinä käytetään neliö-widgetiä, ja sen pohjalta miten tulisi muodostaa widget. 

11.1 TK_WINDOW -MUODOT 

TK_Windowia käytetään osoitteistona, jossa määritellään jokainen ikkuna. Kun muodostetaan uusi ikkuna niin Tk siirtää tiedon siitä Tk_Window:in ja myöhemmin tämä osoitteisto pitää esittää oikealla muodolla läpäistäkseen sen myöhemmin. Tk_Window sisältää valmiiden ikkunoiden tietoja, kuten kokoja, muotoja ja nimiä etc. Tätä tietoa ei ole kuitenkaan mahdollista suoraan lukea tai muokata osoitteistosta. Ainoa tapa on käsitellä Tk:n makroja ja tapahtumia, jolloin Tk_Window saa uutta tietoa. 

11.2 MITEN MUODOSTAA TK_WINDOW? 

Tk-ohjelmat tyypillisesti käyttävät kahta menettelytapaa luomaan ikkunoita: Tk_CreateMainWindow ja Tk_CreateWindowFromPath. Tk_CreateMainWindow muodostaa uuden ohjelman; se kutsuu useimmiten pääohjelmaa. Ennen kuin voidaan kutsua Tk_CreateMainWindowia on Tcl-kääntäjä saatava käyttämään ohjelmaa. Tk_CreateMainWindow vaatii kolme argumenttia sisältäen kääntäjän ja kaksi merkkijonoa(string). Esim.  ScreenName-argumentti antaa näytölle nimi, johon pääikkuna tullaan muodostamaan. ScreenName voidaan määritellä myös NULLiksi, jolloin Tk valitsee oletusserverin. Viimeinen argumentti edellisessä Tk_CreateMainWindow:ssa käytettävän ohjelman tuleva nimi, kuten vaikka kello kello-ohjelmassa etc. Tämä on se nimi, jota muut ohjelmat käyttävät käskytettäessa uusia ohjelmia. 

Tk_CreateMainWindow siis muodostaa pääikkunan ja rekisteröi sen nimen siten, että muut voivat kutsua sitä ja merkitsee kaikki Tk-käskyt kääntäjälle. Jos ohjelmasta löytyy virheilmoitus, niin Tk_CreateMainWindow palauttaa NULL ja jättää kääntäjälle virheilmoituksen interp->result. 

Tk_CreateWindowFromPath lisää uuden ikkunan olemassa olevaan ohjelmaan. Tätä käytäntöä käytetään silloin, kun muodostetaan uusia widgetejä ja niillä on seuraavanlainen prototyyppi:  Tkwin-argumentti on merkki jo olevasta ikkunasta. Sen ainoa tarkoitus on yksilöidä ohjelma, joka muodostaa uuden ikkunan. PathName antaa koko nimen uudelle ikkunalle, kuten vaikka .a.b.c . Nimeä ei tarvitse löytyä, vain sen "äiti" pitää löytyä (kuten .a.b). Jos screenName on tyhjä, niin ikkuna on sisäinen ikkuna; muuten uusi ikkuna on ylempitasoinen ikkuna. Virheen esiintyessä vrt. Tk_CreateMainWindow. 

Tk sisältää myös kolmannen ikkunanmuodostusmenettelytavan nimeltä Tk_CreateWindow. Tämä vastaa Tk_CreateWindowFromPath-menettelytapaa, erotuksena uusi ikkuna nimetään hieman eri tavalla, johon ei nyt paneuduta. 

11.3 IKKUNALUOKAN ASETTAMINEN 

Tk_SetClass-menettelytapa määrittelee tietyn luokan ikkunalle seuraavasti:
Edellisesä luokan nimi määritty "Foo"-nimiseksi. Tk:ssa käytetään luokkien nimiä muutamien vaatimuksien takia, kuten lähettämällä valintoja valintataulukkoon tai tapauskäsittelijöille. Luokan nimenä voidaan käyttä mitä tahansa merkkiä, mutta on huomattava, että ensimmäinen merkki kirjoitetaan isolla. 

11.4 IKKUNAN TUHOAMINEN 

Tk_DestroyWindow-menettelytapaa lukee Tk_windowia argumenttina tuhoten ikkunan. Tk_DestroyWindow tuhoaa myös mahdolliset lapsi-ikkunat. Tuhoamalla pääikkunan ohjelmasta tuhoaa kaikki ikkunat ohjelmasta ja tämän johdosta usein aiheuttaa ohjelmasta poistumisen. 

11.5 TK_WINDOWS-PERUSOPERAATIOT 

Makron nimi
Tulostyyppi
Merkitys
Tk_Attributes
XSetWindowAttributes
*
Ikkunaominaisuus kuten kursori tai reunus
Tk_Changes
XWindowChanges *
Ikkunan paikka, koko, kokoamisjärjestys
Tk_Class
Tk_Uid
Ikkunaluokan nimi
Tk_Colormap
Colormap
Ikkunoinnin värivaihtoehdot
Tk_Depth
int
Bittejä pikseliä kohti
Tk_Display
Display
Ikkunan näyttö
Tk_Height
int
Nykyinen ikkunan korkeus pikseleinä
Tk_internalBordrWidth
int
Sisäisen kehyksen leveys pikseleinä
Tk_IsMapped
int
1 jos ikkuna järjestetty, 0 muuten
Tk_IsTopLevel
int
1 jos ylempitasoinen ikkuna, 0 jos sisäinen
Tk_Name
Tk_Uid
Nimi emoikkunan kanssa. Pääikkunalle palauttaa ohjelman nimen.
Tk_Parent
Tk_Window
Emoikkuna tai NULL pääikkunalle.
Tk_pathName
char *
Ikkunan täysi jono-osoitus
Tk_ReqWidth
int
Vaadittu leveys pikseleinä
Tk_ReqHeight
int
Vaadittu korkeus pikseleinä
Tk_Screen
Screen *
X-näyttö ikkunalle
Tk_ScreenNumber
int
Ikkunaruudun indeksi
Tk_Visual
Visual *
Ikkunan visuaalinen kuvaus
Tk_Width
int
Nykyinen ikkunan leveys pikseleinä
Tk_WindowId
Window
X määrittelee ikkunan
Tk_X
int
X-koordinaatti emoikkunan kanssa
Tk_Y
int
Y-koordinaatti emoikkunan kanssa

Taulukko 8. Ikkunaoperaatiot.



12. YHTEENVETO 

Tcl/Tk -ohjelmakokonaisuus on pätevä ohjelmisto niille, jotka jo osaavat ohjelmoida. Ohjelmisto ei välttämättä vielä vakuuttanut seminaariesitelmän tekijöitä erinomaisuudellaan, vaikkakin mahdollisuuksia toteuttaa erilaisia kokonaisuuksia tuntui olevan hyvinkin monipuolisesti. Meidän seminaarimme kuitenkin pitäytyi loppujen lopuksi vain raapaisemaan Tcl/Tk:n pintaa, joten emme ehkä saaneet täyttä kuvaa siitä. C++ -ohjelmistot ja Tcl/Tk-ohjelmisto ovat mahdollisuuksiltaan samankaltaisia. Tcl/Tk on kuitenkin tarkoitettu ohjelmoijille, jotka jo ovat pitkällä ohjelmien luomisessa. 

Kokonaisuutta latisti se, että me seminaariesitelmän tekijät emme ole Unix-pohjaisten laitteiden asiantuntijoita, johon olisi löytynyt pätevä Tcl-kääntäjä, mutta Tk-puoli näyttäytyi kuitenkin positiivisessa valossa. Tämä ja Tcl-seminaari on siten paljolti tehty kirjoitetun materiaaalin pohjalta. Pahoittelemme huonolla suomenkielellä tehtyjä kirjoituksia. Seminaarin tekoa suomenkielisen materiaalin puute, joten jouduimme suurimman osan käytetystä käsitteistöistä kääntämään oman päämme avulla ja "terveen järjen pohjalta". 



LÄHTEET: