Tcl/Tk
Willemers Informatik-Ecke
Ausgesprochen "tickel tihkäi". Tcl ist eine Skriptsprache. Tcl steht für Tool Command Language. Tk ist eine Erweiterung von Tcl zur Gestaltung von grafischen Oberflächen.

Tcl

Interpreter

In Tcl geschriebene Skripten werden durch den Interpreter tclsh ausgeführt. Man kann also tclsh aufrufen und den Skript als Parameter angeben oder man fügt in die erste Zeile des Skripts ein, welcher Interpreter den Skript ausführen soll.

#!/usr/bin/tclsh

Der Interpreter muss dabei immer mit vollem Pfad angegeben werden. Den Pfad bestimmt man mit dem Befehl which tclsh.

Für die Ausführung von Tcl-Skripten, die Tk verwenden, wird als Interpreter wish verwendet.

Kommandos

Ein Tcl-Skript ist eine Folge von Kommandos. Kommandos werden durch einen Zeilenumbruch oder durch Semikolon getrennt. Jedes Kommando besteht aus Worten, die wiederum durch Leerzeichen getrennt werden. Das erste Wort ist der Befehlsname, die folgenden die Argumente des Kommandos. Kommandos geben immer einen String zurück.

#!/usr/bin/tclsh
puts stdout "Hello World!"

Variablen

Variablen werden mit dem Kommando set besetzt. Das Kommando set erwartet als ersten Paramter die Variable und als zweiten Parameter den String, der der Variablen zugewiesen werden soll.

set Zielvariable Zeichenkette

Substitution

Substitution heißt Ersetzung. Die Zuordnung von Werten an Variablen erfolgt nicht durch die Zuweisung mit dem Operator =, sondern durch das zweite Argument des set-Kommandos. Steht dort keine Zeichenkettenkonstante, wird man eine Ersetzung vorfinden. Die einfachste Ersetzung ist die Variablensubstitution. Durch Voranstellen eines Dollarzeichens wird der Inhalt der Variable und nicht ihr Name verwendet.

Eine Kommandosubstitution steht immer in eckigen Klammern. Der Inhalt der eckigen Klammern wird interpretiert und vor der Abarbeitung des Kommandos zurückgegeben.

#!/usr/bin/tclsh
set a huhu
set b $a
set c [expr 3 * 4]
puts stdout $b
puts stdout $c

Die Ausgabe des Beispiels ist in der ersten Zeile das Wort huhu und in der zweiten Zeile die Zahl 12. Der Variablen c wird in der dritten Anweisung das Ergebnis der Anweisung expr 3 * 4 zugewiesen. Das Kommando expr berechnet einen mathematischen Ausdruck, den es als Parameter bekommt und gibt das Ergebnis als Zeichenkette zurück.

Quotation

Durch Anführungszeichen können mehrere Worte so zusammengefasst werden, dass sie vom Interpreter als ein Wort verarbeitet werden. Es wird aber keine Substitution verhindert.

Dazu werden geschweifte Klammern verwendet. Sie verhindern die Interpretation aller dazwischen liegenden Sonderzeichen.

Kommentare

Wie in den UNIX-Skripten üblich, ist das # das Kommentarzeichen. Allerdings muss es am Anfang eines Kommandos stehen, also am Anfang einer Zeile oder durch ein Semikolon vom vorhergehenden Kommando getrennt.

Kontrollstrukturen

Auch wenn die Kontrollelemente aussehen wie besondere Konstrukte, sind sie ebenfalls Kommandos
if      for   switch  break
foreach while eval    continue
Ein kleines Beispiel: Umkehrung einer Liste in einer while-Schleife:

set b ""
set i [expr [llength $a] -1]
while {$i >= 0} {
  lappend b [lindex $a $i]
  incr i -1
}

Prozeduren

Eine Prozedur wird mit dem Wort proc eingeleitet. Es folgt der Name der Prozedur und ihre Parameternamen. Zum Schluss folgt in geschweiften Klammern der Körper der Prozedur.

proc sub1 x {expr $x-1}

Die oben definierte Prozedur wird wie ein Kommando sub1 aufgerufen.

Tk

Implementierte Widgetklassen:

Frame       Menubutton Canvas
Label       Menu       Scrollbar
Button      Message    Scale
Checkbutton Entry      Listbox
Radiobutton Text       Toplevel

Jedes Widget wird erzeugt, indem das Klassenkommando aufgerufen wird. Auf den Klassennamen folgt der Fenstername, der mit einem Punkt beginnt. Am Ende folgen Konfigurationsoptionen.

Geometrie

Mit dem Befehl place können Widgets in ihrem Fenster positioniert werden. Mit dem Befehl pack werden die Widgets arrangiert.

button .ok -text Ok
button .cancel -text Cancel
button .help -text Help
pack .ok .cancel .help -side left

Zum Auffüllen des Platzes gibt es die Option -fill

pack .ok .cancel .help -side top -fill x

Ereignisse

Auf Aktionen der Benutzer muss reagiert werden. Dazu wird dem Widget bei seiner Erzeugung eine Option -command mitgegeben. Der dahinter stehende Tcl-Skript wird bei einer Aktion aufgerufen.

Mit dem Kommando bind können Ereignisse an Skripten gebunden werden.

bind .b <Control-h> {backspace .t}

Das Fenster ist .b, das X-Ereignis ist Control-h und in den geschweiften Klammern steht die Reaktion auf das Ereignis.

Auf die Koordinaten des Ereignisses kann mit den Substitutionen %x und %y zugegriffen werden. Das betroffene Fenster steht in %W und das Zeichen des Ereignisses ist %A.

Beispiel

Ein Fenster mit einem Eingabefeld und zwei Buttons. In das Eingabefeld wird eine Rechenaufgabe gestellt. Auf Ok wird das Ergebnis berechnet und wieder ins Eingabefeld gestellt. Der zweite Button verlässt das Programm.

#!/usr/bin/wish
label .info -text Rechenclown
entry .aufgabe -textvariable aufgabe
button .ok -text Ok -command {calc $aufgabe}
button .cancel -text Beenden -command exit
pack .info .aufgabe -side top
pack .ok .cancel -side left

proc calc aufgabe {
set aufgabe [expr $aufgabe]
.aufgabe delete 0 10000
.aufgabe insert 0 $aufgabe
}


Literatur

John K. Ousterhout: Tcl und Tk. Entwicklung grafischer Benutzerschnittstellen für X Window System
Das Standardwerk vom Erfinder der Sprache
Brent Welch: Practical Programming in Tcl and Tk (3rd Edition)
Wer für englische Originalliteratur schwärmt, dem sei dieses Buch empfohlen.