Die Kommandozeile wird selbstständig
Einführung in Tcl/Tk, Teil 2
Darf's auch etwas mehr sein?
Nun brauchen Sie eine Möglichkeit, die Eingabe des Nutzers mit einem von Ihnen gewählten Wert zu vergleichen. Dies können Sie mit dem Befehl string. Mit dem Argument match vergleicht er zwei Zeichenketten, die danach angegeben werden. Sind die Zeichenketten gleich, so ist sein Ergebnis eine 1, sind sie ungleich, so liefert er eine 0 zurück. Die genaue Befehlssyntax lautet:
string match erste_Zeichenkette zweite_Zeichenkette
Probieren Sie auch das beim Trockenschwimmen mit dem Interpreter aus:
% % # zwei gleiche Zeichenketten % string match j j 1 % string match ja ja 1 % % # zwei ungleiche Zeichenketten % string match j n 0 % string match ja j 0 %
Um den Befehl string in der if-Kontrollstruktur als Abfrage zu verwenden, müssen Sie ihn in eckige Klammern schreiben. Der Interpreter wertet zunächst den zwischen den Klammern stehenden Befehl aus und reicht dann das Ergebnis an if weiter. War es eine 1, so interpretiert das if dies als ja, kam eine 0 heraus, so wertet if das als nein.
Nun können Sie den Quellcode Ihres poff-Programms um die Abfrage erweitern. Die öffnende Klammer des Skripts, {, muss dabei in der selben Zeile wie das if stehen. Nur so erkennt der Interpreter das Skript als zweites Argument für if an. Das else wiederum muss sich mit der schließenden Klammer } auf einer Zeile befinden, um als Option von if akzeptiert zu werden.
puts "Möchten Sie die Bildgröße eingeben (j/n)?"
gets stdin bildgroesse
if { [ string match j $bildgroesse ] } {
puts "Geben Sie bitte die Breite des Bildes ein"
gets stdin bildbreite
puts "Geben Sie bitte die Höhe des Bildes ein"
gets stdin bildhoehe
# Aufruf von povray mit Groessenangabe
} else {
# Aufruf von povray ohne explizite Groessenangabe
}Das macht dann …
Nun bleibt nur noch Punkt 5 auf der Liste: das Starten von povray – entweder mit Angabe der Bildgröße oder ohne.
Der Befehl exec kann alle ausführbaren Programme aufrufen, also auch das Programm povray. Als erstes Argument benötigt exec den Namen des auszuführenden Programms. Tcl startet dieses dann mit den restlichen Optionen. Der korrekte Aufruf lautet:
# Mit Groessenangaben: exec povray +I$dateiname +O$bildname +W$bildbreite +H$bildhoehe & # Ohne explizite Groessenangaben: exec povray +I$dateiname +O$bildname &
Wenn Sie die if- und else-Skripte noch um den jeweiligen Povray-Aufruf ergänzen, haben Sie Ihr komplettes Programm fertig! Sie finden es vollständig in Listing 1 abgedruckt, die gelernten Befehle sind in Tabelle 1 noch einmal beschrieben. Experimentieren Sie damit, bevor Sie in Heft 08/2000 die letzte Folge unserer kleinen Programmierreihe erwartet.
Listing 1
#!/usr/bin/tclsh
# Vorstellung des Frontends
puts "Willkommen bei poff, dem interaktiven Povray-Frontend"
# Aufforderung an den Nutzer
puts ""
puts "Geben Sie bitte den Namen der zu rendernden Datei ein"
# Einlesen der Nutzer-Eingabe
gets stdin dateiname
# Erstellen des Namens für die Bilddatei
set bildname [ file rootname $dateiname ]
set bildname $bildname.tga
# Erfragen, ob Bildgroesse gewuenscht
puts "Möchten Sie die Bildgröße eingeben (j/n)?"
gets stdin bildgroesse
# Wenn Bildgroesse gewuenscht, dann erfragen
if { [ string match j $bildgroesse ] } {
puts "Geben Sie bitte die Breite des Bildes ein"
gets stdin bildbreite
puts "Geben Sie bitte die Höhe des Bildes ein"
gets stdin bildhoehe
# Aufruf von povray mit Groessenangabe
exec povray +I$dateiname +O$bildname +W$bildbreite +H$bildhoehe &
} else {
# Aufruf von povray ohne Groessenangabe
exec povray +I$dateiname +O$bildname &
}
Tabelle 1: Die verwendeten Tcl-Befehle
#!/usr/bin/tclsh
|
Die Aufforderung an den Kernel, den Tcl-Interpreter zu starten |
set <variablenname variableninhalt
|
Variablendeklaration |
puts zeichenkette
|
Ausgabe der Zeichenkette im aufrufenden Terminal |
gets stdin variablenname
|
Entgegennahme der Tastatureingaben des Nutzers vom aufrufenden Terminal |
file rootname dateiname
|
Befehl zum Abschneiden der Dateinamenserweiterung in einem Dateinamen |
if { abfrage } { skript }
|
Kontrollstruktur, die das skript abhängig vom Ergebnis der abfrage abarbeitet oder nicht |
if { abfrage } { skript 1 } else { skript 2 }
|
Kontrollstruktur, die abhängig vom Ergebnis der abfrage entweder skript 1 oder skript 2 ausführt |
string match zeichenkette1 zeichenkette2
|
Befehl zum Vergleich zweier Zeichenketten |
exec programm optionen &
|
Aufruf eines Unix-Programmes von Tcl aus |
Wie geht's weiter?
Der dritte Teil in Heft 08/2000 widmet sich hauptsächlich den Gestaltungsmöglichkeiten von grafischen Benutzerschnittstellen ("GUIs") mit Tcl/Tk.
Glossar
Widget-Library
Funktionen zum Programmieren von Fensterelementen wie z.B. Buttons und Menüs.
Interpreter
Interpreter übersetzen das Programm jedesmal in Maschinencode, wenn es aufgerufen wird. Die Übersetzung wird nicht auf Dauer gespeichert.
rendern
Erstellen eines Bilds aus mathematischen Daten.
Prompt
Das Bereitzeichen einer Shell, an dem Sie erkennen, dass Sie jetzt einen Befehl aufrufen können.
&
Wenn Sie von einem Interpreter aus ein anderes Programm starten, ist er so lange blockiert, bis Sie das Programm wieder beendet haben. Das gilt sowohl für die bash, den Standardkommandozeileninterpreter unter Linux, als auch für Tcl. Sie können den Interpreter aber aktionsfähig halten, wenn Sie an den Programmaufruf ein & anhängen und das Programm damit "im Hintergrund" starten.
Infos
[1] Eine gute Einführung in Povray ist von Christian Perle im Linux-Magazin 04/1998 erschienen. Sie ist auch im WWW erhältlich:http://www.linux-magazin.de/ausgabe/1998/04/Povray/povray.html
[2] Falls Sie sich näher mit Povray beschäftigen möchten, bekommen Sie es hier: http://www.povray.org/
[3] Tcl/Tk ist zwar bei jeder Distribution dabei, im Source-Code können Sie es aber auch herunter laden bei: http://www.scriptics.com/
[4] 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
[5] 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
[6] Online-Infos bekommen Sie unter anderem bei: http://www.sco.com/Technology/tcl/Tcl.html
[7] Der erste Teil dieser Programmiereinführung ist erschienen im Linux-Magazin 04/2000, S. 120--124



