Tcl/Tk - Grundlagen

Start der Testumgebung

Aufruf unter Unix/X11 in einem Terminalfenster:
  wish
Im Terminalfenster werden interaktiv die Kommandos eingegeben, das zusätzliche Fenster ermöglicht die graphische Ausgabe.

Unter Windows wish aus dem Startmenü auswählen oder über die Kommandozeile

  k:\tcltk80\bin\wish
Hier werden zwei Fenster geöffnet, eins für die Kommandoeingabe und eins für graphische Ausgaben.

Tcl-Kommandos

Der einheitliche Kommandoaufbau für Tcl-Kommandos ist
  command arg1 arg2 arg3 ...
Die Argumente werden durch ein oder mehrere Leerzeichen bzw. Tabulatoren getrennt. Kommandos werden voneinander durch einen Zeilenwechsel bzw. ein Semikolon (;) getrennt.

Beispiel:

  puts Hallo
Sollen mehrere, durch Leerzeichen getrennte Wörter zu einem Argument zusammengefaßt werden, müssen diese mit den Spezialzeichen " " bzw. { } eingeschlossen (gruppiert) werden:
  puts "Hallo Linux!"
  puts {Good bye, Bill}

Variablen

Variablen werden wie üblich benannt und müssen nicht extra deklariert werden. Mit dem Kommando set wird einer Variablen ein Wert zugewiesen:
  set a 5
  set b "Hallo"
Der Typ einer Variablen wird bei der Wertzuweisung festgelegt. Der set-Befehl liefert als Rückgabewert den zugewiesenen Wert (wird bei manchen wish-Implementationen angezeigt).

Um auf den Wert einer Variablen zuzugreifen, muß ihr ein $-Symbol vorangestellt werden:

  puts "a: $a"
  puts "b: $b"
(Achtung: Die Klammerung mit {} geht hier schief!)

Kommandosubstitution

Jede Kommandozeile wird genau einmal ausgewertet. Oft soll jedoch das Ergebnis eines Kommandos durch ein anderes sofort weiterverarbeitet werden, z.B. soll die Stringlänge des Variableninhalts von b angezeigt werden. Hier muß die Auswertung des eingeschlossenen Kommandos durch Einschließen in [ ] erzwungen werden:
  set c [string length "Hallo Linux!"]
  puts "b: $b, Länge von b: [string length $b]"

Mathematische Ausdrücke

Die Berechnung mathematischer Ausdrücke wird mit dem Kommando expr ausgeführt, dessen Ergebnis üblicherweise einer Variablen übergeben oder angezeigt wird:
  set radius 1
  set umfang [expr 2*$radius*3.14]
  puts "Fläche: [expr 3.14*$radius*$radius]"
Die Nutzung von Funktionen ist ebenfalls möglich:
  puts "Wurzel 2: [expr sqrt(2)]"
Zahlen, die mit einer 0 beginnen, werden als Oktalzahlen interpretiert, Zahlen, die mit 0x beginnen, als Hexadezimalzahlen. Die wissenschaftliche Schreibweise 2.97e8 für 2.97*108 ist ebenfalls möglich.

Backslash-Substitution

Soll die Sonderbedeutung der Spezialzeichen wie $ [ ] etc. aufgehoben werden, wird ihnen ein Backslash \ vorangestellt.
  puts \$a
  ==> $a (und nicht 5)
Das Backslash verliert seine Sonderbedeutung durch Doppeltschreiben: \\. Mit Hilfe der Backslash-Substitution können auch Spezialzeichen wie Tabulator (\t) und Zeilenschaltung (\n) sowie nicht auf der Tastatur vorhandene Sonderzeichen (\x## bzw. \###, wobei ## bzw. ### der Hexadezimal- bzw. Oktalcode des Zeichens darstellen) benutzt werden:
 
  puts "a:\t$a\n\xa1\xa2"
  ==> a:      5
      ¡¢

Gruppierung

Für die Gruppierung zu einem Argument stehen die Symbole " " bzw. { } zur Verfügung. Während die Anführungszeichen nur die Trennwirkung von Leerzeichen, Tabulatoren und Zeilenschaltungen aufheben und die alle Substitutionen innerhalb der Gruppe durchführen ([] \), werden innerhalb geschweifter Klammern keinerlei Substitutionen gemacht, alles wird so interpretiert, wie es dasteht:
  puts "$a $b\n[string length $b]"
  ==> 5 Hallo
      5
  puts {$a $b\n[string length $b]}
  ==> $a $b\n[string length $b]
Eine weitere wichtige Anwendung des \ ist die Aufhebung der Zeilenschaltung. Ist es das letzte Zeichen der Zeile, wird das Zeilenende durch ein Leerzeichen ersetzt und die Folgezeile ohne führende Leerzeichen direkt angehängt. Da Tcl-Kommandos immer zusammenhängend auf einer Zeile stehen müssen, wird das sehr häufig bei längeren Kommandos benötigt:
  puts "Das ist \
        ein langer Text"

Kommentare

Sobald Befehlsfolgen in Dateien abgelegt werden, ist es sinnvoll, diese mit Kommentaren zu versehen:
  # Kommentar
Ein Kommentar kann auch in einer Zeile mit einem Befehl stehen. Alles nach dem #-Zeichen wird vom Interpreter ignoriert.