8.4. Tcl/Tk

Hvis du gerne vil programmere grafik under Linux, er Tcl/Tk et godt sprog. Det er et forholdsvist nemt sprog at lære. Tcl er et makro-sprog, som har fået en søster Tk, der er en grafisk del med samme nemme syntaks. Det er et meget velegnet sprog til hurtigt at få en grafisk brugergrænseflade til et (tekst-baseret) program.

Prøv at indtaste følgende program (kald det editor.tcl) efter at have installeret Tcl og Tk (rpm -i tcl-8.0.4-29.rpm; rpm -i tk-8.0.4-29.i386.rpm - eller måske lidt anderledes, alt efter hvilke versioner du netop har fået). Den øverste linje svarer til, at du kører Red Hat, SuSE har installeret wish i /usr/X11R6/bin.

#!/usr/bin/wish -f

label .l -text "Filename:"
label .l2 -text "Editor:"
set fname testfil
set editor emacs
entry .e -relief sunken -width 30 -textvariable fname
entry .e2 -relief sunken -width 30 -textvariable editor
pack .l -side left
pack .e -side left -padx 1m -pady 1m

bind .e <Return> {
  exec xterm -e $editor $fname
}

pack .l2 -side left
pack .e2 -side left -padx 1m -pady 1m
bind .e2 <Return> {
  exec emacs  $fname
}
Gør programmet eksekverbart ved at skrive
[daisy@linus daisy]$  chmod +x editor.tcl
og kør det ved at skrive ./editor.tcl. Ret i tekstfelterne, og se, hvad der sker, når du trykker return i hvert af tekstfelterne. Programmet er vist på Figur 8-5.

Figur 8-5. Tcl/Tk programmer tcl1.tcl

Et andet Tcl/Tk eksempel, der laver et simpelt stopur med start og stop funktion. Programmet bliver ikke forklaret, men skal illustrere, hvor lidt kode der skal til at lave et program, som med andre programmeringssprog ville være meget længere. Programmet er vist på Figur 8-6.

Figur 8-6. Et stopur i Tcl/Tk

#!/usr/bin/wish -f

label .counter -text 0.00 -relief raised -width 20
button .start -text Start -command {
    if $stopped {
	set stopped 0
	tick
    }
}
button .stop -text Stop -command {set stopped 1}
pack .counter -side bottom -fill both
pack .start -side left -fill both -expand yes
pack .stop -side right -fill both -expand yes

set seconds 0
set hundredths 0
set stopped 1

proc tick {} {
    global seconds hundredths stopped
    if $stopped return
    after 50 tick
    set hundredths [expr $hundredths+5]
    if {$hundredths >= 100} {
	set hundredths 0
	set seconds [expr $seconds+1]
    }
    .counter config -text [format "%d.%02d" $seconds $hundredths]
}

bind . <Control-c> {destroy .}
bind . <Control-q> {destroy .}
focus .

En variant af stopur programmet er et nyttigt program, som viser status på batteriet i en laptop. I dette eksempel har vi erstattet den første linje, svarende til SuSE 6.1 placering af wish, og der kræves, at kommandoen apm er installeret, dvs. apmd-2.4-57.rpm eller lignende.

#!/usr/X11R6/bin/wish -f

 label .counter -text 0 -relief raised -width 50
 button .start -text Start -command {
         tick
 }
 button .stop -text Stop -command { destroy .}
 pack .counter -side left -fill both
 pack .stop -side right -fill both 

 proc tick {} {
     after 1000 tick
     set tot [eval exec apm]
     .counter config -text [format "%s" $tot]
 }

 tick

bind . <Control-c> {destroy .}
bind . <Control-q> {destroy .}
 focus .

Hvis du har lyst til at stifte nærmere bekendtskab med Tcl/Tk, er dette en god og meget omfattende bog:

Brent B. Welch: Practical Programming in Tcl and Tk, Prentice Hall, ISBN 0-13-616830-2, 630 sider + CDROM.