Die Kommandozeile hat unbestritten ihre Vorteile. Doch manche Aufgaben lassen sich einfacher mit einer grafischen Benutzeroberfläche erledigen. Tcl/Tk ist ein wunderbares Tool, mit dem sich ohne großen Aufwand grafische Benutzeroberflächen erstellen lassen. Im ersten Teil dieser Einführung lernen Sie, wie man Buttons erstellt und mit ihrer Hilfe Befehle ausführt.
Tcl/Tk ist eine Kombination aus der SkriptspracheTcl, die sehr einfach zu erlernen ist, und dem ToolkitTk, mit dem sich spielend grafische Benutzeroberflächen, sogenannte GUIs (“Graphical User Interfaces”), zusammenbauen lassen.
Diese Einführung in Tcl/Tk (ehe Sie sich die Zunge brechen, sagen Sie einfach “Tickl-Tikej” dazu) soll Sie in die Lage versetzen, in Zukunft eigene GUIs zu schreiben. Nach ersten Schritten mit einer Knopfleiste zum Aufruf Ihrer Lieblingsprogramme tauchen Sie in Teil 2 tiefer in die Strukturen von Tcl ein, bevor Sie in Teil 3 noch mehr Möglichkeiten von Tk kennen lernen. Mit diesem Wissen ausgerüstet können Sie dann ein kleines Tool zur leichteren Benutzung von Povray, einem freien Raytracer, schreiben.
Programme wie Povray rufen förmlich danach, mit einer grafischen Oberfläche versehen zu werden, weil sie über jede Menge Kommandozeilenoptionen gesteuert werden, die sich Gelegenheitsnutzer oft nicht merken können. Da bietet es sich an, mit Tcl/Tk ein kleines Progrämmchen zu stricken, das die Kommandozeile per Mausklick zusammenbastelt.
Tcl wurde Ende der 80er Jahre von John Ousterhout in Berkeley an der University of California entwickelt. Später kam das Toolkit Tk dazu, um auch grafisch-interaktive Programme mit Tcl erstellen zu können. Ousterhout ging dann zu Sun, portierte Tcl/Tk auf fast alle bekannten Betriebssysteme und betreibt nun eine eigene Firma, Scriptics, die sich zum Ziel gesetzt hat, Tcl/Tk weiterhin als freie Software zu fördern, gleichzeitig aber kommerzielle Anwendungen darum herum zu erstellen und vor allem kommerziellen Support zu bieten.
Ihr Wunsch ist Befehl
Genug der Vorrede: Programmieren lernt man am Rechner, und so starten Sie doch einfach die wish (Abkürzung für “Windoing Shell”), den Tcl/Tk-Interpreter, in einem X-Terminal durch die Eingabe von
wish
Es öffnet sich ein kleines Fenster mit dem Titel wish, und im X-Terminal erscheint ein Prozentzeichen. Hiermit gibt die wish bekannt, dass sie nun auf Ihre Eingaben wartet.
Um mit einer grafischen Benutzeroberfläche zu kommunizieren, brauchen Sie “Schaltflächen”, bei Tcl/TK Widgets genannt. Der Ausdruck widget kommt von “window” (“Fenster”) und “gadget” (“Dingsbums”) und bezeichnet somit ein “Fensterdings”. Ein mögliches, und wohl auch das häufigste Widget, ist der gute alte Button. Von diesem erwarten Sie, dass er das tut, was Sie von ihm möchten, wenn Sie mit der Maus darauf klicken. Was dann passiert, soll er Ihnen schon durch seine Beschriftung mitteilen.
Mit Tcl/Tk ist dies besonders leicht, da ein Button einfach mit dem Befehl button .buttonname erzeugt wird. Seine Aufschrift und das, was er auf einen Mausklick hin ausführen soll, geben Sie ihm als Optionen mit auf sein Buttonleben. Damit heißt Ihre erste Zeile Tcl/Tk-Code also
button .beenden -text "Beenden" -command exit
Achten Sie bitte auf die Leerzeichen, und schreiben Sie mindestens jeweils eines. Mehrere schaden nicht. Wenn Sie die erste Zeile eingegeben haben, antwortet Ihnen die wish mit dem Ergebnis Ihrer Eingabe; hier ist es .beenden, der Namen des Buttons. Der Knopf selbst wird allerdings noch nicht angezeigt. Dazu dient eine zweite Zeile.
pack .beenden
In ihr wird der pack-Windowmanager dazu aufgefordert, im Fenster der wish Platz für den Button .beenden einzurichten. Für den Windowmanager sind alle Widgets Kinder des Top-Level-Widgets mit dem einfachen Namen “.” (“Punkt”). Er macht das Top-Level-Widget gerade so groß, dass auch besagter .beenden-Button genau hinein passt. Tippen Sie also ruhig die zweite Zeile ein, ohne sich vom Dazwischenreden der wish gestört zu fühlen.
Das Fenster der wish verändert seine Größe und enthält jetzt einen Button mit der Aufschrift Beenden. Wenn Sie auf den Button klicken, verschwindet das Fenster. Da Sie dem Knopf für diesen Fall den Befehl exit mit gegeben haben, wird mit dem Programm auch der Interpreter beendet.
Jetzt sollen Sie aber beginnen, erste “bleibende Werte” zu schaffen, sprich ein Programm. Dieses können Sie mit der Zeit verändern und vergrößern; auf jeden Fall aber speichern und damit auch öfters laufen lassen. Öffnen Sie daher Ihren Lieblingseditor, und geben Sie darin die folgenden Zeilen ein:
button .beenden -text "Beenden" -command exit pack .beenden
Speichern Sie die Datei beispielsweise unter dem Namen erstes.tcl, und starten Sie nun die wish, indem Sie sie mit dieser Datei als Argument aufrufen.
wish erstes.tcl
Wenn alles geklappt hat, müsste sie sich so verhalten, als hätten Sie diese Zeilen direkt eingegeben.
Fehler? Mögen wir nicht!
Die “Lieblingsbeschäftigung” einer Programmiererin besteht darin, zu verstehen, was sie falsch gemacht hat, warum der Interpreter “motzt” oder weshalb das Ergebnis des Programms so gar nicht dem entspricht, was sie eigentlich wollte. Häufig sind es einfach nur Schreibfehler, die die korrekte Ausführung verhindern. Lassen Sie mal vor dem Namen des Buttons den Punkt weg, wenn Sie den Packer anweisen, Platz zu schaffen:
button .beenden -text "Beenden" -command exit pack beenden
Der Interpreter kann Ihr Programm nicht starten und wird meckern, dass er mit dem Argument beenden für den Packer unzufrieden ist (Abbildung 2). Er macht eine kurze Anmerkung zur Art des Fehlers; hier spuckt er noch einen Tipp zur richtigen formalen Syntax (also pack mit einer möglichen Option und mindestens einem Argument, die weiteren Argumente sind in ? eingeschlossen, also optional). Außerdem gibt er nach while executing die genaue Zeile aus, in der der Fehler aufgetreten ist, und benennt noch Datei und Zeilennummer.
Es kann aber auch sein, dass ein Fehler nicht schon beim Starten, sondern erst später im Programm erkennbar wird. Tcl/Tk öffnet dann ein Fenster, in dem es versucht, verständlich zu machen, wo es gerade hapert. Testen Sie dies, indem Sie das Kommando des Buttons falsch schreiben, beispielsweise so:
button .beenden -text "Beenden" -command exut pack .beenden
Wenn Sie nun auf Ihren Beenden-Button klicken, dann erscheint ein Fenster mit dem Fehler (Abbildung 3). Genauere Informationen inklusive Zeilennummer und dem fehlerhaftem Code erhalten Sie durch Anklicken des “Stack Trace“-Buttons.
Heinzelmännchen
Es mag ja ganz nett sein, schon ein Programm schreiben zu können, das sich selbst beendet. Auf die Dauer dürfte das allerdings nicht befriedigen. Also müssen weitere Knöpfe her, die auch tatsächlich Dinge tun, die einem die Arbeit erleichtern. Um bei der Beispielanwendung zu bleiben, könnte dies ein weiterer Button sein, der Ihnen schon mal Ihren Lieblingseditor startet. Tcl/Tk bietet eine einfache Schnittstelle, um Unix-Befehle ausführen zu lassen.
exec Unix-Befehl
weist die Shell an, sich des Unix-Befehls anzunehmen. Dieses Kommando wird dabei genau so geschrieben wie in einem X-Terminal. Wenn Sie den Befehl im Vordergrund starten, stoppt Ihr Programm so lange, bis das aufgerufene Programm beendet wird. Um dies zu verhindern, müssen Sie es mit einem abschließenden & im Hintergrund laufen lassen. Ergänzen Sie also bitte Ihr Programm um die folgenden Zeilen. Die Reihenfolge der Buttons wird durch die Reihenfolge bestimmt, in der Sie sie dem Packer übergeben.
button .nedit -text "NEdit" -command { exec nedit & }
pack .nedit
Hier wurde exec nedit & in geschweifte Klammern geschrieben. Deren Inhalt wertet der Interpreter erst aus, wenn er durch das Anklicken des Buttons dazu veranlasst wird. Haben Sie einen anderen Lieblingseditor? Nur Mut, fügen Sie weitere Zeilen an oder ersetzen Sie die vorhandenen durch
button .emacs -text "Emacs" -command { exec emacs & }
pack .emacs
button .xemacs -text "XEmacs" -command { exec xemacs & }
pack .xemacs
button .pico -text "Pico" -command { exec xterm -e pico & }
pack .pico
button .vi -text "Vi" -command { exec xterm -e vi & }
pack .vi
Vergessen Sie bei Ihrer Testklickerei nicht, dass Sie Esc :! aus den Fängen des vi rettet!

Abbildung 4: Das erste Programm
Gleiche Größe für alle!
Klar, so unterschiedlich groß wie in Abbildung 4 können die Buttons nicht bleiben. Kein Problem. Mit ein paar zusätzlichen Optionen ist das Größen-Durcheinander schnell behoben. Der Pack-Windowmanager kümmert sich darum, dass alle Fensterelemente den Platz bekommen, den sie brauchen. Dabei geht er hierarchisch vor. Er macht das Top-Level-Widget immer gerade so groß, dass alle Kind-Widgets hinein passen. Diese sind wiederum genau so groß, dass ihre Schrift gut zu sehen ist. Wenn Sie nun der verständliche Wunsch befällt, alle Buttons gleich breit zu machen, müssen Sie dem Packer die Anweisung geben, den kleineren Buttons die gleiche Breite wie die ihres größten Bruders zu geben:
pack .buttonname -fill x
Falls Sie auch noch möchten, dass die Buttons immer größer werden, wenn Sie das Programm-Fenster vergrößern, lassen Sie sie “expandieren”. Eine Expansion gilt immer für die Richtung, die durch die Option -fill angegeben wurde, im Folgenden also in Richtung der x-Koordinate (Abbildung 5):
pack .buttonname -fill x -expand true

Abbildung 5: Alle Buttons sind gleich…
Tabelle 1: Die Argumente der Widgets
| -text Aufschrift | Die Aufschrift des Buttons. |
| -command {Befehl} | Das Kommando, das der Button beim Klick ausführen soll. |
| -relief Art des Buttonreliefs | Mögliche Buttonreliefs sind: flat (flach), raised (erhoben), sunken (eingedrückt), ridge und groove (jeweils mit zierlichen Rändern). |
| -padx pixelzahl | Zusätzlicher Abstand der Aufschrift zum Buttonrand in x-Richtung. |
| -pady pixelzahl | Zusätzlicher Abstand der Aufschrift zum Buttonrand in y-Richtung. |
| -image [image create photo -file bildname] | Belegt den Button mit einem Bild. Das Bild muss als gif, ppm oder pgm vorliegen. |
| -foreground farbe | Die Schriftfarbe der Aufschrift, wobei diese durch einen Namen, aber auch durch eine mit “#rgb” definierte Form angegeben werden kann. rgb bezeichnet dabei den Wert der Farben rot, grün, blau. Jeder Farbanteil wird jeweils durch zwei hexadezimale Zahlen, also Zahlen zwischen 00 und ff ersetzt. -foreground lässt sich auch durch -fg abkürzen. |
| -background farbe | Die Hintergrundfarbe, auch mit -bg abkürzbar. |
| -width pixelbreite | Eine festgelegte Breite des Buttons. |
| -height pixelhöhe | Eine festgelegte Buttonhöhe. |
| -font Fontbezeichnung | Wird der Font z.B. mit “Helvetica 24” angegeben, so werden diese Schriften falls nicht vorhanden als fixed-Schrift in der angegebenen Größe angenähert. Es kann aber auch ein genauer Fontname wie -Adobe-Helvetica-Medium-R-Normal–*-180-* angegeben werden. |
Die Widgets selbst haben auch eine Menge Möglichkeiten, sich ins rechte Licht zu setzen. In Tabelle 1 sind, ohne vollständig sein zu wollen, eine Reihe weiterer Gestaltungsmöglichkeiten aufgelistet, die selbstverständlich auch für Buttons gelten. Beispielsweise ändern Sie die Schriftfarbe, wenn Sie folgende Änderung in Ihrem Programmcode vornehmen:
button .emacs -text "Emacs" -command { exec emacs & } -fg darkred
oder
button .xemacs -text "Xemacs" -command { exec xemacs & } -fg "#3366ff"
Wie Sie sehen, kann die Farbe dabei als Name oder hexadezimal mit sechs Stellen hinter dem Kreuz angegeben werden, wobei die ersten beiden Stellen den Rot-, die dritte und vierte Stelle den Grün- und die fünfte und sechste Stelle den Blauanteil definieren.
Doch nun Bühne frei für Ihre eigenen Experimente: Sie haben bestimmt noch mehr oder andere Programme, die Sie wie ihre Frühstückszeitung gerne schon bereit liegen haben, wenn Sie sich an den Tisch (sprich: Desktop) setzen.
Falls Ihnen der Sinn nach Spielereien steht, verpassen Sie doch mal einem Button mit -text [exec ls] die Namen aller Dateien in Ihrem aktuellen Verzeichnis als Beschriftung. Hier muss exec ls übrigens in eckige Klammern eingeschlossen werden, da diese vom Interpreter sofort durch das Ergebnis des dazwischen stehenden Befehls (also der Ausgabe von ls) ersetzt werden.
Und wenn Sie genug gespielt haben, wartet im nächsten Teil die Povray-Aufgabe auf Sie.
Wie geht’s weiter?
Im zweiten Teil dieser Einführungsserie in Tcl/Tk lernen Sie, welche weitergehende Möglichkeiten Ihnen bei Befehlen offen stehen. Er erscheint in Heft 06/2000.
Der dritte Teil in Heft 08/2000 widmet sich dann hauptsächlich den Gestaltungsmöglichkeiten von GUIs mit Tcl/Tk.
Glossar
-
Skriptsprache
-
Als Skriptsprachen werden Programmiersprachen bezeichnet, die nicht für das jeweilige Betriebssystem kompiliert, sondern bei ihrer Ausführung von einem Interpreter interpretiert und ausgeführt werden. Diese Programme oder Skripte können während ihrer Erstellung ausprobiert und geändert werden, und eignen sich gut zu Automatisierung kleinerer Datenverarbeitungsaufgaben.
-
Toolkit
-
Als Toolkit (“Werkzeugkasten”) werden im Allgemeinen gesammelte Hilfsmittel für besondere Aufgaben bezeichnet. Bei Tcl/Tk ist das Toolkit Tk eine Zusammenstellung von Funktionen zur Erstellung grafischer Fensterelemente.
-
Raytracer
-
Raytracer sind Programme zur Erzeugung photorealistischer Bilder mit dem Computer. Sie berechnen die Eigenschaften eines Bildpunkts, indem sie den vom Original ausgehenden Lichtstrahl verfolgen.
-
xterm -e
-
Mit der Option -e wie “execute” bringt man die Terminalemulation xterm dazu, beim Starten das dahinter stehende Programm auszuführen. Dies ist notwendig, wenn Sie ein Programm aufrufen möchten, welches kein eigenes Fenster verwaltet, sondern im Terminal läuft, wie pico oder vi. Beim emacs kommt es darauf an, wie Sie ihn installiert haben, ob mit oder ohne eigene Fensterverwaltung.
-
hexadezimal
-
Normalerweise bewegen wir uns im dezimalen Zahlenraum, das heißt, wir zählen von 0 bis 9, dann hängen wir eine Stelle an und zählen mit zwei Stellen weiter. Die hexadezimale Zählweise beginnt auch bei 0, zählt dann aber nach der 9 mit Buchstaben weiter. Nach 9 kommt A, dann B bis F, also bis zum Äquivalent von 16. Erst dann geht’s mit der 10 (sprich: eins-null) weiter. Mit 50 dezimalen Jahren sind Sie also erst “32 hex”…
Infos
[1] Tcl/Tk ist zwar bei jeder Distribution dabei, im Source-Code bekommen Sie es aber auch bei: http://www.scriptics.com/
[2] John Ousterhout, der “Erfinder” von Tcl/Tk hat selbst ein sehr lesenswertes Buch über Tcl/Tk geschrieben: Ousterhout, John K.: “Tcl und Tk”, Addison-Wesley, Bonn 1995
[3] Wenn Sie schon über Tcl/Tk-Grundkenntnisse verfügen, die Sie auf sinnvolle Weise vertiefen möchten, ist folgendes Buch zu empfehlen: Harrison, Mark und McLennan, Michael: “Effektiv Tcl/Tk programmieren”, Addison-Wesley, Bonn 1998
[4] Falls Sie nur schnell nachschauen wollen, wie eine Option, von der Sie schon mal gehört haben, wirklich heißt, hilft: Raines, Paul: “Tcl/Tk – kurz & gut”, O’Reilly, Köln 1998
[5] Online-Infos bekommen Sie unter anderem bei: http://www.sco.com/Technology/tcl/Tcl.html
[6] Falls Sie sich vorbereitend mit Povray beschäftigen möchten, bekommen Sie es hier: http://www.povray.org/







