Liite 4. Autolaskuri-esimerkki Tcl/Tk sekä C-kielillä.

/*****************************************************************

** Autolaskuri, 2. versio. C-kielinen osio.

**

** Autolaskuri -esimerkki. Käyttöliittymä tehty Tcl/Tk -kielillä,

** aliohjelmat C-kielellä. Autolaskurin kuva löytyy luvusta 5 (kuva 5.3).

** C-ohjelman kääntö tapahtuu koneesta riippuen esimerkiksi

** komennolla:

** cc -o ohjelma ohjelma.c -ltk -ltcl -lX11 -lm

** Eeva-Kaisa Rouhiainen, tehty 7.7.1998

*********************************************************************************/

#include <tk.h>

#include <tcl.h>

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

 

int c_henkilo_autot = 0;

int c_kuorma_autot = 0;

 

/*************************/

/* Aliohjelmien esittelyt*/

/*************************/

 

int lisaa_auto( ClientData clientdata, Tcl_Interp *interp, int argc,char *argv[]);

int nollaa( ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[]);

 

/************************************************************/

/* Pääohjelma */

/* Pääohjelmasta kutsutaan vain Tcl_AppInit -aliohjelmaa */

/* Tk_Main -aliohjelman avulla. */

/************************************************************/

main (int argc, char *argv[] )

{

Tk_Main(argc, argv, Tcl_AppInit);

exit(0);

}

/************************************************************/

/* Aliohjelma Tcl_AppInit */

/* Aliohjelmassa luodaan tulkki (interp) sekä linkitetään */

/* muuttujat Tcl:n ja C-koodin välille. Aliohjelmasta */

/* kutsutaan myös Tcl-koodia. */

/************************************************************/

int Tcl_AppInit(Tcl_Interp *interp)

{

int code;

if ( Tcl_Init(interp) == TCL_ERROR ) { return TCL_ERROR; }

if ( Tk_Init(interp) == TCL_ERROR ) { return TCL_ERROR; }

/* Tcl_CreateCommand -komennon avulla esitellään aliohjelmat lisaa_auto ja nollaa Tcl-kieliselle koodille */

Tcl_CreateCommand (interp, "lisaa_auto", lisaa_auto, (ClientData) Tk_MainWindow(interp),(Tcl_CmdDeleteProc*) NULL);

Tcl_CreateCommand (interp, "nollaa", nollaa,(ClientData) Tk_MainWindow(interp),(Tcl_CmdDeleteProc*) NULL);

/* Tcl_LinkVar-komennon avulla sidotaan Tcl-kieliset ja C-kieliset muuttujat toisiinsa. */

Tcl_LinkVar(interp, "tcl_henkilo_autot", (char *) &c_henkilo_autot, TCL_LINK_INT);

Tcl_LinkVar(interp, "tcl_kuorma_autot", (char *) &c_kuorma_autot, TCL_LINK_INT);

/*Tcl_EvalFile -komennon avulla suoritetaan Tcl-koodi */

code = Tcl_EvalFile(interp, "koodi.tcl");

if(*interp->result != 0) {printf("virhetilanne: %s\n", interp->result); }

if (code != TCL_OK) { printf("virhetilanne TCL_ERROR !\n"); exit(1); }

Tk_MainLoop();

return TCL_OK;

}

 

/************************************************************/

/* Aliohjelma lisaa_auto */

/* Aliohjelmassa lisätään joko kuorma-autojen tai henkilö- */

/* autojen lukumäärää yhdellä. */

/************************************************************/

int lisaa_auto( ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])

{

if (argc != 2) {

interp->result = "wrong # args";

return TCL_ERROR;

}

if (strcmp(argv[1], "henkiloauto") == 0) { c_henkilo_autot++;}

if (strcmp(argv[1], "kuormaauto") == 0) { c_kuorma_autot++; } 

return TCL_OK;

}

/************************************************************/

/* Aliohjelma nollaa */

/* Aliohjelmassa nollataan autojen lukumäärät. */

/************************************************************/

int nollaa( ClientData clientdata, Tcl_Interp *interp, int argc, char *argv[])

{

if (argc != 1) {

interp->result = "wrong # args";

return TCL_ERROR;

}

c_henkilo_autot = 0;

c_kuorma_autot = 0;

return TCL_OK;

}

 

#####################################################

# Autolaskuri, 2. versio. Tcl/Tk -kielinen osio.

#

# Eeva-Kaisa Rouhiainen, tehty 7.7.1998

#####################################################

 

set henkilo_autot 0

set kuorma_autot 0

 

# wm -ikkunan käsittely

wm title . "Autolaskuri"

 

# Frame

frame .laskurit

frame .laskurit.kuorma

frame .laskurit.henkilo

frame .menubar -relief raised -bd 2

 

# Label

label .otsikko -text "AUTOLASKURI" -bg white

label .laskurit.henkilo.henkiloentry -width 5 -relief sunken -bd 1 -textvariable henkilo_autot

label .laskurit.kuorma.kuormaentry -width 5 -relief sunken -bd 1 -textvariable kuorma_autot

 

# Menu

menubutton .menubar.file -text "File" -underline 0 -menu .menubar.file.menu

menu .menubar.file.menu

.menubar.file.menu add command -label "Exit" -underline 0 -accelerator "Alt+e" -command exit

 

# Button

button .laskurit.henkilo.henkilobutton -text "Henkilöautoja" -command {

lisaa_auto henkiloauto

set henkilo $tcl_henkilo_autot

}

button .laskurit.kuorma.kuormabutton -text "Kuorma-autoja" -command {

lisaa_auto kuormaauto

set kuorma_autot $tcl_kuorma_autot

}

button .nollaa -text "Nollaa" -command {

nollaa

set henkilo_autot $tcl_henkilo_autot

set kuorma_autot $tcl_kuorma_autot

}

 

# Pack

pack .menubar -side top -fill x

pack .menubar.file -side left

pack .laskurit.henkilo.henkilobutton .laskurit.henkilo.henkiloentry -side top -fill x

pack .laskurit.kuorma.kuormabutton .laskurit.kuorma.kuormaentry -side top -fill x

pack .laskurit.henkilo .laskurit.kuorma -side left

pack .laskurit.henkilo -padx 1m

pack .laskurit.kuorma -padx 1m

pack .otsikko .laskurit .nollaa -side top

pack .nollaa -pady 2m

pack .otsikko -fill x -ipady 3m

 

# Bind

bind all <Alt-e> {exit}

bind all <KeyPress-h> {

lisaa_auto henkiloauto

set henkilo_autot $tcl_henkilo_autot

}

bind all <KeyPress-k> {

lisaa_auto kuormaauto

set kuorma_autot $tcl_kuorma_autot

}

bind all <KeyPress-n> {

nollaa

set henkilo_autot $tcl_henkilo_autot

set kuorma_autot $tcl_kuorma_autot

}

 


gif
Luk-tutkielma: Tcl/Tk -opiksi ja iloksi.