Sie ist schneller als die Vorgängerversion und mit neuen Widgets und vielen Verbesserungen unter der Oberfläche ausgestattet: Seit Mitte September ist Tcl/Tk 8.4 fertig. Spinbox, Labelframe und Panedwindow, Undo-Fähigkeit im Text-Widget und besseres Handling von Listen führen die Feature-Liste an.
Am 18. September war es so weit: Jeff Hobbs konnte das Release Announcement zu Tcl/Tk 8.4 versenden. Neben vielen Bugfixes für alle Plattformen, MacOS-X-Unterstützung und 64-Bit-Support bietet die neue Version eine ganze Reihe neuer Features, die für den Einsatz unter Linux interessant sind.
An der Basis
Änderungen an Tcl fallen auf den ersten Blick nicht so stark auf wie ein neues Widget in Tk – aber gerade an der Basis hat sich einiges getan. Eine wichtige Verbesserung kommt ohne neues Kommando aus: Tcl 8.4 ist schneller geworden, in einigen Fällen ist es doppelt so schnell wie die Vorgängerversion. Die neue Version übersetzt mehr Kommandos in Bytecode und führt ihn auch schneller aus als bisher. Besonders bei Schleifen mit »for« oder »while« fällt das neue Tempo auf, aber auch Operation mit Listen sind schneller.
Bei vielen Kommandos wurde die Syntax erweitert, es sind neue Optionen und Parameter hinzugekommen. Einige Befehle sind gänzlich neu. Tabelle 1 fasst die wesentlichen Änderungen und Neuerungen zusammen. Viel Feinarbeit ist in die Kommandos für Listen geflossen. Bei Tcl sind Listen die am häufigsten benutzte Datenstruktur, Verbesserungen in diesem Bereich sind daher besonders gern gesehen.
Die auffallendste Änderung betrifft den direkten Zugriff auf innere Elemente von geschachtelten Listen, also Listen, deren Elemente selbst wieder Listen sind. Sie werden häufig benutzt, um komplexe Informationen zu transportieren. Listing 1 wandelt den Inhalt von »/etc/group« in eine geschachtelte Liste um und greift dann auf ihre Elemente zu. Die Originaldatei könnte wie folgt beginnen:
root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:
Diese Datei wandelt das Listing zeilenweise (mit Hilfe von »gets«) in Listenelemente um. Diese Elemente sind selbst wieder Listen (durch das »split«-Kommando getrennt). Das Ganze sieht dann so aus:
{root x 0 root} {bin x 1 root,bin,
daemon} {daemon x 2 {}}
Mit der Angabe von mehreren Indizes extrahiert »lindex« direkt ein beliebiges Element: »lindex $groups 2 0« greift auf die dritte Liste zu (die Zählung beginnt bei null) und darin auf das erste Element, also den String »daemon«. Früher mussten dazu mehrere Kommandos geschachtelt werden.
Das neue »lset«-Kommando verändert direkt ein Element in einer Liste. In älteren Versionen musste man mit »lreplace« eine neue Liste erzeugen. Die neue Liste konnte man zwar in derselben Variable speichern, der Aufwand ist dabei aber deutlich höher.
Listing 1: Listen mit Tcl 8.3 und 8.4
01 set fd [open /etc/group r]
02 while {[gets $fd line] >=0} {
03 lappend groups [split $line :]
04 }
05 close $fd
06
07 set index 5
08
09 # Alte Version mit Tcl 8.3
10 set name [lindex [lindex $groups $index] 0]
11 set gid [lindex [lindex $groups $index] 2]
12 set users [lindex [lindex $groups $index] end]
13 puts "$name: gid $gid, users $users"
14
15 set element [list $name x $gid ""]
16 set group [lreplace $groups $index $index $element]
17
18 # Neu Version mit Tcl 8.4
19 set name [lindex $groups $index 0]
20 set gid [lindex $groups $index 2]
21 set users [lindex $groups $index end]
22
23 lset groups $index end $users
Pfade und Dateisysteme
Beim Zusammensetzen mehrerer Dateipfade kommt öfter ein Pfad der Form »/home/cz/test/../../cz/bin« zustande, das Kommando »file normalize« verwandelt ihn in den einfachen Pfad »/home/cz/bin«. Auch das Anlegen von Datei-Links beherrscht Tcl nun plattformübergreifend. Unter Unix, Windows und MacOS legt »file link« einen Hard- oder Symlink an oder fragt Informationen dazu ab. Nicht nur die geöffneten Dateien, auch Sockets und andere Channels ermittelt das Kommando »file channel«. Das ist sehr praktisch, um regelmäßig aufzuräumen.
Tcl unterstützt jetzt auch virtuelle Dateisysteme. Dateien auf einem FTP-Server oder in einem Archiv lassen sich nun mit den Kommandos »file«, »open« oder »cd« wie normale Dateien bearbeiten, als ob sie direkt auf der Festplatte wären. Dabei ist in Tcl 8.4 nur die Unterstützung für normale Dateien enthalten, weitere Dateisysteme enthält die Erweiterung Tclvfs[2]. Mit ihr werden FTP, HTTP und Zip-Dateien zugänglich, außerdem können eigene virtuelle Dateisysteme in Tcl geschrieben werden. Eines der nächsten Feder-Lesen wird dies näher vorstellen.
An der Oberfläche
Gegenüber Toolkits wie Gtk oder Swing ist Tk etwas ins Hintertreffen geraten. Zwar ist Tk für Programmierer immer noch wesentlich einfacher zu bedienen, es bietet aber weniger Widgets. Tk 8.4 verkleinert den Vorsprung ein wenig, es enthält drei zusätzliche Widgets: »spinbox«, »labelframe« und »panedwindow«.
Die Spinbox (in Abbildung 1 sind zwei Beispiele zu sehen) besteht aus einem Eingabefeld und zwei Buttons, die zwischen verschiedenen Werten wählen. Die erlaubten Einträge sind mit der Option »-values Liste« als Liste anzugeben oder es sind Zahlen zwischen den Begrenzungen »-from Startwert« und »-to Endwert« zugelassen.
Mit »-textvariable Variable« schreibt das Widget den aktuellen Wert fortlaufend in die angegebene Variable, Änderungen an der Variablen überträgt es in das Eingabefeld. Den mit »-command Callback« vereinbarten Code führt die Spinbox bei jeder Änderung des Werts aus.
Der Callback erhält neben dem Widget-Namen in »%W« und dem aktuellen Wert in »%s« auch noch den String »up« oder »down« für die jeweilige Richtung in »%d«. Praktisch sind Spinbox-Widgets vor allem zur Auswahl aus vielen Werten, wenn Radiobuttons zu viel Platz einnehmen würden.

Abbildung 1: Das Spinbox-Widget enthält neben dem Eingabefeld zwei Buttons, die den Wert schrittweise ändern (oben: Wochentage, unten: Zahlen).

Abbildung 2: Vier Labels, die gleichzeitig den Text und ein Bild darstellen und zusätzlich von einem Rahmen umgeben sind.
Schöne Rahmen
Rahmen mit Text wurden schon im letzten Feder-Lesen bei den BWidgets vorgestellt, inzwischen enthält Tk selbst ein solches Element. Peter Spjuth hat das Labelframe-Widget implementiert. Es ist wie ein normales Frame-Widget einsetzbar, kann aber auch einen Text am sichtbaren Rahmen anbringen. Der Text lässt sich an neun möglichen Stellen positionieren und mit einem beliebigen Font darstellen.
Statt eines einfachen Textes kann Labelframe auch ein beliebiges anderes Widget einbetten: In der Mitte von Abbildung 3 enthält der Labelframe einen Button mit Bitmap in der Südost-Position. Das neue Widget lässt sich hervorragend benutzen, um GUIs eine logische Gliederung zu geben. Dazu ist es besser geeignet als das Pendant aus den BWidgets, da es sich wie ein normaler Rahmen (Frame) verhält.

Abbildung 4: Beim Eintippen interpretiert das Text-Widget einzelne Wörter als je einen Bearbeitungsschritt (abwechselnd blau und rot dargestellt). Copy & Paste (unterste Zeile) gilt als einzelner Schritt.
Ein weiteres Gliederungselement ist das Panedwindow-Widget. Es teilt ein GUI horizontal oder vertikal in mehrere Bereiche auf. Die Trennlinie ist verschiebbar, auf Unix-Systemen dient dazu ein kleiner Knopf auf der Linie (siehe Abbildung 3), unter Windows kann man die ganze Linie mit der Maus greifen. Kinder werden in dieses Widget mit »$pw add $kind1 $kind2 $kind3« eingefügt, sie lassen sich mit »$pw panes« abfragen und mit »$pw forget $kind1« wieder entfernen. Gegenüber dem »PanedWindow« aus BWidgets ist Tk 8.4 leistungsfähiger, es unterstützt mehr als zwei Kinder und ist einfacher zu nutzen.
Auf der Wunschliste stehen noch weitere Widgets, zum Beispiel ein Tree und eine Combobox. Bis jetzt hat sich jedoch noch niemand für diese Arbeit gefunden, die meisten Programmierer sind offenbar mit den BWidgets zufrieden.
Auch bei den bestehenden Widgets hat sich einiges getan. Sowohl im Text-Widget wie bei Label und Button gibt es Neuigkeiten. Label, Button und Menubutton konnten bisher schon mit Text oder Bild umgehen, seit 8.4 endlich auch mit beidem gleichzeitig. Gerade bei Menüs ist dies hilfreich, um die Einträge nicht nur am Text, sondern auch an ihrem Icon zu erkennen. Auch Toolbars profitieren davon: Jetzt ist es leicht, die Icons dort mit Text zu versehen.

Abbildung 3: Der äußere Labelframe umschließt ein Panedwindow, das drei Child-Widgets enthält. Das mittlere Kind enthält einen weiteren Labelframe, diesmal mit einem Bild.
Gemeinsam stärker
Die Option »-compound« bestimmt, ob das Bild links, rechts, über, unter oder im Text angeordnet wird. Abbildung 2 zeigt ein Beispiel mit vier Label-Widgets. Jedes Label ist zur Demonstration mit einem Rahmen versehen.
Ist die Option »-compound« eher als Feinschliff zu sehen, hat das Text-Widget grundlegender zugelegt. Es unterstützt nun Undo und Redo. Ein Undo-Puffer speichert alle Bearbeitungsschritte, die das Kommando »$text edit undo« wieder rückgängig macht. Da es unpraktisch wäre, jedes eingegebene Zeichen einzeln rückgängig zu machen, kann das Text-Widget komplexere Bearbeitungsschritte zusammenfassen.
Die Bearbeitungsschritte sind voneinander durch einen logischen Separator getrennt. Dieser Separator wird in den Undo-Puffer eingefügt. Von einem Undo-Kommando sind alle Änderungen bis zum nächsten Separator betroffen. Offen ist zunächst, was einen Bearbeitungsschritt ausmacht. Bei einem Editor für normalen Text könnte es ein einzelnes Zeichen, ein Wort oder eine Silbe sein, bei einem Editor für Programmiersprachen vielleicht ein ganzes Kommando oder ein Zeile.
Das Einfügen der Separatoren kann das Text-Widget selbst übernehmen, dazu dient die Option »-autoseparator true«. Listing 2 enthält die wesentlichen Code-Ausschnitte für eine eigene Implementierung, das komplette Programm ist wie immer auf dem FTP-Server zu finden[3]. Die Callback-Funktion »teilen« reagiert auf jedes eingegebene Zeichen. Wenn es sich um ein Leerzeichen, einen Tabulator oder Zeilenumbruch handelt, beginnt ein neuer Bearbeitungsschritt mit »$text edit separator«. Das Ergebnis ist in Abbildung 4 illustriert, hier sind die Schritte abwechselnd rot und blau markiert. Der Undo-Knopf bringt den Text Schritt für Schritt in ältere Zustände zurück.

Abbildung 5: Das Kommunikationspaket Privaria enthält das Whiteboard Coccinella, auf das mehrere Anwender von verschiedenen Rechnern aus gleichzeitig zugreifen können.
Listing 2: Undo im Text-Widget
01 text .text -exportselection true -undo true
02 -autoseparators false -maxundo 50
03
04 button .buttons.u -text "Undo" -state disabled
05 -command {.text edit undo; teilen ""}
06
07 bind .text <KeyPress> "teilen %K"
08
09 proc teilen {key} {
10 if {[regexp {minus|space|Tab|Return} $key]} {
11 .text edit separator
12 }
13 }
Fazit
Mit Version Tcl-Version 8.4 ändert sich nur eine Stelle hinter dem Komma, es ist nicht der große Sprung, der fast alles ändert. Aber es steckt eine Menge Arbeit im Feinschliff, etwa in der schnelleren Ausführung oder den erweiterten Kommandos. Auch die virtuellen Dateisysteme oder Techniken zum Erstellen so genannter Startkits werden erst in den jeweiligen Erweiterungen sichtbar, die nun ohne Änderung der Basisquellen möglich sind. Auf der Oberfläche hat sich weniger getan als ursprünglich geplant, die BWidgets[4] bieten dafür weiterhin eine gute Ergänzung. (fjl)
Installation |
|
Um die neuen Features zu testen, müssen Tcl und Tk installiert werden. Beide sind unter der Adresse [http://www.tcl.tk/software/tcltk/8.4.html] als komprimierte Archive zu finden. Die Installation ist denkbar einfach – auspacken und kompilieren. Das Installieren muss in der Regel als Root erfolgen. # cd /usr/local # tar -xzf tcl8.4.0-src.tar.gz # cd tcl8.4.0/unix # ./configure --prefix=/usr/local --enable-shared # make install # cd ../.. # tar -xzf tk8.4.0-src.tar.gz # cd tk8.4.0/unix/ # ./configure --prefix=/usr/local --enable-shared # make install Danach stehen unter »/usr/local/bin/« eine neue »tclsh« und eine neue »wish« zur Verfügung. Eventuell ist noch eine neuere Version der »tkcon«[1] nötig, dann kann das Ausprobieren beginnen. |
Neues aus der Tcl-Welt |
|
Neben der neuen Release von Tcl/Tk ist in den letzten Wochen einiges passiert. Wer wegen der Undo-Fähigkeiten des Text-Widgets endlich einen eigenen Editor schreiben möchte, dem sei ein Blick auf George Staplins »ctext«-Widget[5] empfohlen. Es erweitert das normale Text-Widget um Syntax-Highlighting und Zeilennummerierung. PostgreSQL ist für viele die beste freie Datenbank, die Oberfläche Pg Access bietet einen einfache Zugriff darauf. Auf[6] steht nun die neuste Version bereit, sie verwendet die BWidgets und kann mit mehreren Datenbankverbindungen gleichzeitig umgehen. Dass Tcl auch auf einem Server viel leisten kann, zeigt sich an Sun Microsystems: Mitte der 90ger Jahre hat ein Tclhttpd-Webserver die komplette Domain von Sun ausgeliefert, verriet Brent Welch. Neueren Datums ist Websh[7], ein mächtiger Web Application Server für den Apache. Websh wurde von Netcetara an die Apache Group übergeben und steht jetzt unter der Apache Software License. Einer der Köpfe hinter Websh, Andrej Vckovski, hat auf der O’Reilly Open Source Convention einen Vortrag darüber gehalten, unter[8] sind die Unterlagen zu seinem und zu weiteren Vorträgen zu finden. Ein anderes freies Programm im Netzbereich wird ausgerechnet von einem amerikanischen Patentanwalt entwickelt: Privaria, eine Suite zur sicheren Kommunikation über das Netz[9]. Privaria unterstützt neben einem einfach zu bedienenden Tunnel eine Remote-Shell für Tcl-Kommandos, Tight-VNC und FTP sowie Coccinella[10]. Coccinella (siehe Abbildung 5) wurde von Mats Bengtsson entwickelt. Es bietet ein Whiteboard für Texte, Linien und Bilder, das man im Peer-to-Peer-Modus oder mit Hilfe von Jabber mit anderen Rechnern teilen kann. Leider funktioniert die Quicktime-Unterstützung zum Abspielen von Filmen unter Linux nicht, die Tonwiedergabe klappt hingegen problemlos. |
Infos |
|
[1] Tkcon, die Tcl/Tk-Konsole: [http://tkcon.sourceforge.net] [2] Virtuelle Dateisysteme mit Tclvsf: [http://sourceforge.net/projects/tclvfs] [3] Listings zum Artikel: [ftp://ftp.linux-magazin.de/pub/listings/magazin/2002/12/Feder-Lesen/] [4] BWidgets: [http://tcllib.sourceforge.net/] [5] Erweitertes Text-Widget Ctext: [http://www.xmission.com/~georgeps/ctext/] [6] GUI für PostgreSQL mit Pg Access: [http://www.pgaccess.org/] [7] Application Server Websh: [http://tcl.apache.org/websh/] [8] Tcl-Vorträge auf der O’Reilly Open Source Convention: [http://conferences.oreillynet.com/pub/w/10/tcl_presentations.html] [9] Privaria: [http://eepatents.com/privaria/] [10] The Coccinella: [http://hem.fyristorg.com/matben/] |
Der Autor |
|
Carsten Zerbst arbeitet bei Atlantec an einem PDM-System für den Schiffbau. Daneben beschäftigt er sich mit dem Einsatz von Tcl/Tk. Seine Homepage ist [http://www.groy-groy.de/czerbst]. |






