Effektive X-Programmierung mit Tcl/Tk


Typischerweise wurden Applikationen für das X-Window-System bisher in C unter Nutzung der Bibliotheken Xlib und Xt sowie darauf basierender Widget-Sets (z.B. Athena oder Motif) geschrieben. Diese Vorgehensweise ist zeitaufwendig und verlangt vom Programmierer umfangreiche Detailkenntnisse, die mit der eigentlich zu lösenden Aufgabe nichts zu tun haben. Auch die Verwendung objektorientierter Ansätze (z.B. C++ mit InterViews) dürfte kaum dazu geeignet sein, mehr Anwender zu animieren, ihre Software mit grafischen Oberflächen auszustatten. Seit einiger Zeit favorisieren daher immer mehr Implementatoren eine relativ neue, sehr stabil funktionierende und frei verfügbare Entwicklungsumgebung namens Tcl/Tk, die von John K. Ousterhout an der University of California at Berkeley geschaffen wurde und durch ihn eine ständige Wartung und Weiterentwicklung erfährt. Wie die bisher gesammelten Erfahrungen zeigen, kommen damit selbst Neueinsteiger schnell zu ansprechenden Resultaten, da viele Eigenheiten von X11 vor ihnen verborgen bleiben.

Tcl (gesprochen wie das englische Wort 'tickle') steht für Tool Command Language und bezeichnet eine universell einsetzbare, leistungsfähige, interpretative Programmiersprache, die in C-Applikationen eingebettet wird und durch diese einfach zu erweitern ist. Dieses Prinzip veranschaulicht die folgende Abbildung:

Die wohl wichtigste Tcl-Erweiterung ist Tk, ein X11-Toolkit inklusive Widget-Set, das die effiziente Erstellung von X-Anwendungen zuläßt, die weitgehend dem Look&Feelvon Motif folgen. Fast die gesamte Funktionalität dieses Toolkits kann mittels Tcl-Kommandos genutzt werden, so daß die meisten Anwender nicht auf die C-Schnittstellen von Tcl/Tk zurückgreifen müssen. Sie schreiben Tcl-Scripts und lassen diese von einer speziellen Shell, z.B. der mitgelieferten Widget-Shell wish, interpretieren, woraus verschiedene Vorteile gegenüber der Nutzung von C resultieren. Tcl/Tk zeichnet sich durch eine relativ einfache Syntax und leistungsfähige Kommandos aus, was zu einer Begrenzung des Lernaufwands sowie der Codemenge führt. Mit Tcl existiert eine einheitliche interpretative Sprache zur Steuerung aller Aspekte interaktiver Applikationen, wozu die Funktionalität, die Interfaces, das Zusammenspiel einzelner Komponenten sowie die Kommunikation mit anderen Applikationen zählen. Damit können zur Laufzeit sehr komplexe Programm-Manipulationen vorgenommen werden, die ein Austesten neuer Ideen stark erleichtern und ein schnelles Prototyping zulassen. Außerdem bewirkt der Wegfall der sonst bei Programmänderungen notwendigen Recompilation eine deutliche Zeitersparnis. Der durch die interpretative Arbeitsweise bedingte Overhead ist vergleichsweise gering und beeinträchtigt daher das Laufzeitverhalten in der Regel nur unmerklich.

Nachfolgend sollen einige ausgewählte Eigenschaften von Tcl kurz dargestellt werden. Die Sprache verfügt u.a. über Variablen, Prozeduren, Listen, Ausdrücke und Schleifen, wobei bestimmte Konzepte an die UNIX-Shells sowie C, Lisp und Perl erinnern. Der einzige Datentyp ist der String. Damit ist eine prinzipielle Austauschbarkeit von Programmen und Daten gegeben. Tcl-Kommandos haben eine Shell-typische Syntax. Sie bestehen aus mindestens einem Wort, wobei das erste Wort den Namen des Kommandos darstellt und die evtl. folgenden Wörter als Argumente aufgefaßt werden. Leerzeichen und Tabulatoren trennen Wörter, Zeilenschaltungen und Semikolons begrenzen die Kommandos.


   # Dieses Script setzt die Variablen a, b und c 
   # auf die Werte 2, 3 und 4.
   set a 2
   set b 3 ; set c 4

Zu den syntaktischen Besonderheiten von Tcl gehören verschiedene Formen von Substitutionen sowie des Quoting, deren Verständnis für eine praktische Anwendung sehr wichtig ist. Einen Eindruck davon sollen einige Beispiele geben:

Das Toolkit Tk erweitert Tcl um eine Menge von Kommandos zur Gestaltung grafischer X-Oberflächen, die wie bei anderen Toolkits aus Bausteinen, den sog. Widgets, zusammengesetzt werden. Es gibt 15 Widget-Klassen, darunter Label, Button, Canvas, Frame und Menu. Der Canvas bietet umfangreiche Unterstützung beim Zeichnen, so daß sich eine Nutzung der unkomfortablen Xlib-Routinen erübrigt.

Widgets einer bestimmten Klasse werden durch ein Kommando erzeugt, das den Namen der betreffenden Klasse trägt. Zur Identifikation jedes erzeugten Widgets dient ein eindeutiger Pfadname, der die Stellung des Widgets in einer baumförmigen Hierarchie angibt. Zur Trennung der einzelnen Hierarchiestufen wird ein Punkt verwendet. So bezeichnet .frame.label ein Widget label, das Kind eines Widgets .frame ist, wobei der erste Punkt das Hauptfenster der aktuellen Applikation repräsentiert.

Existierende Widgets können jederzeit über ein Kommando angesprochen und somit manipuliert werden, das genauso heißt wie ihr Pfadname. Tk erzeugt und vernichtet diese Tcl-Kommandos dynamisch. Das folgende Kommando verändert den Text des o.g. Labels:


   .frame.label config -text "Neuer Text"

Widgets können erst dann auf dem Bildschirm erscheinen, wenn sie durch einen Geometrie-Manager verwaltet werden. Tk kennt zwei derartige Manager, den Placer und den Packer, wobei letzterer leistungsfähiger ist und daher häufiger zur Anwendung kommt. Im einfachsten Fall genügt zur Darstellung des Labels .frame.label das nachfolgende Kommando:


   pack .frame.label

Das typische Einsteiger-Programm Hello World könnte als ausführbares Tcl-Script so aussehen:


   #! /uni/global/bin/X11R5/wish -f  
   button .b -text "Hello World" -command { puts "Hello World"; exit }
   pack .b
Das erste Kommando erzeugt einen Button .b mit der Aufschrift Hello World, der beim Anklicken mit der Maus die Zeichenkette Hello World auf die Standardausgabe schreibt und anschließend die Applikation beendet. Mit dem zweiten Kommando wird dieser Button auf dem Schirm dargestellt. Der Unterschied zu den auf C basierenden Lösungen dürfte jedem auffallen, der entsprechende Programme schon einmal zu Gesicht bekommen hat.

Neben den bisher kurz umrissenen Möglichkeiten bietet Tk u.a. folgende Dinge an: Arbeit mit Selections, Kommunikation mit dem Window Manager, Festlegen des Input-Focus, Behandlung von X-Events mittels Tcl-Kommandos sowie eine leistungsfähige Kommunikation mit anderen Tk-Applikationen durch send, die wesentlich mehr bietet als Selections, da hierbei Tcl-Scripts in entfernten Applikationen ausgeführt werden können.

Es gibt mittlerweile eine Vielzahl von Tcl-basierten Paketen. Dazu gehört der Interface-Builder XF, der eine interaktive Erstellung von Tk-Applikationen gestattet.

Folgende Versionen der Software sind aktuell: Tcl 7.3, Tk 3.6, XF 2.3pl11. Sie sind auf /uni/global installiert und können vom FTP-Server des URZ bezogen werden:


   ftp.tu-chemnitz.de:/pub/programming/tools/tcl_tk

Tcl/Tk ist sehr gut dokumentiert. Neben den Manual-Seiten und verschiedenen Papers von John Ousterhout steht eine Vorabversion seines bis spätestens April 1994 bei Addison-Wesley erscheinenden Buches über Tcl/Tk zur Verfügung. Die Source-Distribution enthält des weiteren eine Vielzahl von Beispiel-Programmen, die wertvolle praktische Hinweise geben.

Sollten Sie durch die obigen Ausführungen neugierig geworden sein, so schauen Sie sich Tcl/Tk doch einfach selbst an. Sie werden es bestimmt nicht bereuen.

Holger Trapp
Fakultät für Informatik