Die Kommandozeile macht sich schön (2)
Einführung in Tcl/Tk, Teil 4
Dateibrowser
Einer der meiner Meinung nach schönsten Tcl/Tk-Befehle ist der zum Aufruf eines Dateimanagers. Das geht ganz einfach mit tk_getOpenFile. Wenn Sie nur bestimmte Dateien angezeigt bekommen möchten, erweitern Sie diesen Befehl um die Option -filetypes und geben danach die Art der anzuzeigenden Dateien und deren Endung an. Dabei sind prinzipiell mehrere Kombinationen aus Dokumentenart und -endung möglich. Daher muss jede einzelne Kombination in extra Klammern zusammen gefasst und alle gemeinsam noch einmal in Klammern eingeschlossen werden. Diese Doppel-Klammer-Technik bleibt Ihnen auch dann nicht erspart, wenn Sie nur eine einzige Dokumentenart-Endung-Kombination angeben.
Im Fall des Povray-Interfaces handelt es sich um Povray-Dokumente mit der Endung .pov. Der komplette Befehl lautet damit:
tk_getOpenFile -filetypes { { Povray-Dokumente .pov } }Wenn Sie diesen Befehl im Interpreter testen, sieht das Ergebnis aus wie in Abbildung 2 – natürlich mit anderen Verzeichnisnamen und abweichendem Verzeichnisinhalt.
Zurück gibt tk_getOpenFile den Namen der ausgewählten Datei. Wenn Sie den Befehl in eckigen Klammern aufrufen, werden die Klammern nebst Inhalt durch das Ergebnis des Befehls ersetzt. Dieses können Sie dann in der Variablen pov(bild) speichern und in den Namen der Bilddatei umwandeln.
Dazu verwenden Sie wie in Teil zwei dieser Einführung den Befehl file mit dem Argument rootname und einem Dateinamen. Auf diese Art entfernen Sie die Dateiendung und können eine neue Dateinamenserweiterung anhängen (Zeile 20--30):
proc dateiAuswahl { } {
global pov
# Oeffnen des Dateibrowsers
set pov(szene) [ tk_getOpenFile \
-filetypes { { Povray-Dokumente .pov } }
]
# Erstellen des Namens für die Bilddatei
set pov(bild) [ file rootname $pov(szene) ]
set pov(bild) $pov(bild).tga
}Damit wäre Ihr Programm fertig. Sie glauben nicht, dass das so schnell ging? Nun, dieses Interface ist noch nicht perfekt, da es hauptsächlich zum Erklären von Tcl/Tk entstand. Es könnte z.B. wie in [8] noch die Möglichkeit bieten, die Geometrie nur auf Wunsch einzustellen, oder zusätzlich einen Button zum Starten des Editors besitzen.
Doch nach der Lektüre dieser Einführung sind Sie sicher in der Lage, alles besser zu machen und povgui Ihren Wünschen entsprechend anzupassen.
Listing 1
povguis Oberfläche
Im Folgenden sehen Sie das Arbeitsergebnis unserer vierteiligen Einführung in Tcl/Tk – ein Progrämmchen mit grafischer Oberfläche, mit dem sich der Raytracer PovRay leichter bedienen lässt. Der Quelltext ist durchnummeriert, um das Abschreiben – ohne Zeilennummern – zu erleichtern; im vierten Teil neu hinzu gekommenen und daher im vorliegenden Artikel beschriebenen Code erkennen Sie am Fettdruck.
1 #!/bin/sh
2 #\
3 exec wish "$0"
4
5 ########## Variablendefinition ##########
6 set pov(szene) ""
7 set pov(bild) ""
8 set pov(breite) 400
9 set pov(hoehe) 200
10
11
12 ########## dateiAuswahl ##########
13 # Ermittelt den Namen der Szenendatei
14 # und erstellt daraus den Namen der zu rendernden Datei
15 #
16 # Variablen:
17 # datei(szene): Name der Szenendatei
18 # datei(bild) : Name der zu rendernden Datei
19
20 proc dateiAuswahl { } {
21 global pov
22
23 # Oeffnen des Dateibrowsers
24 set pov(szene) [ tk_getOpenFile \
25 -filetypes { { Povray-Dokumente .pov } }
26 ]
27 # Erstellen des Namens für die Bilddatei
28 set pov(bild) [ file rootname $pov(szene) ]
29 set pov(bild) $pov(bild).tga
30 }
31
32 ########## Fensterelemente ##########
33
34 # Die Frames, in denen die anderen Widgets angeordnet werden:
35 frame .obererRahmen -borderwidth 1 -relief raised
36 frame .mittlererRahmen -borderwidth 1 -relief raised
37 frame .untererRahmen -borderwidth 1 -relief raised
38
39 pack .obererRahmen -side top -fill x
40 pack .mittlererRahmen -side top -fill x
41 pack .untererRahmen -side top -fill x
42
43 # Die Buttons in der unteren Zeile:
44 button .renderKnopf -text Rendern \
45 -command { exec povray +I$pov(szene) +O$pov(bild) \
46 +W$pov(width) +H$pov(height) & }
47
48 button .anzeigeKnopf -text Anzeigen \
49 -command { exec xv $pov(bild) & }
50
51 pack .renderKnopf -in .untererRahmen \
52 -side left -fill x -expand yes
53 pack .anzeigeKnopf -in .untererRahmen \
54 -side left -fill x -expand yes
55
56 # Der Menuebutton mit Menue:
57 menubutton .dateiKnopf -text Datei -menu .dateiKnopf.herunterklappMenue
58
59 menu .dateiKnopf.herunterklappMenue
60 .dateiKnopf.herunterklappMenue add command -label "Szenendatei wählen ..." \
61 -command dateiAuswahl
62 .dateiKnopf.herunterklappMenue add separator
63 .dateiKnopf.herunterklappMenue add command -label "Beenden" -command exit
64
65 pack .dateiKnopf -in .obererRahmen -side left
66
67 # Die Beschriftung für Eingabefeld und Schieberegler:
68 label .bildnameAufschrift -text Bildname
69 label .bildbreiteAufschrift -text Bildbreite
70 label .bildhoeheAufschrift -text Bildhöhe
71
72 # Eingabefeld und Schieberegler:
73 entry .bildnameEingabefeld -width 30 \
74 -textvariable pov(bild)
75 scale .bildbreiteScale -from 20 -to 400 -orient horizontal \
76 -variable pov(width)
77 scale .bildhoeheScale -from 20 -to 400 -orient horizontal \
78 -variable pov(height)
79
80 # Anordnen der Widgets im mittleren Teil:
81 grid .bildnameAufschrift -in .mittlererRahmen -row 0 -column 0 -sticky sw
82 grid .bildbreiteAufschrift -in .mittlererRahmen -row 1 -column 0 -sticky sw
83 grid .bildhoeheAufschrift -in .mittlererRahmen -row 2 -column 0 -sticky sw
84 grid .bildnameEingabefeld -in .mittlererRahmen -row 0 -column 1 -sticky we
85 grid .bildbreiteScale -in .mittlererRahmen -row 1 -column 1 -sticky we
86 grid .bildhoeheScale -in .mittlererRahmen -row 2 -column 1 -sticky we
87
88 # Aendern des Fenstertitels:
89 wm title . "povgui"
Glossar
Povray
Ein Bilderzeugungsprogramm, das aus mathematischen Daten Bilder berechnet ("rendert"). Die Oberflächenfarbe der Objekte einer Szene ermittelt es durch Zurückverfolgen der auftreffenden Lichtstrahlen (daher Raytracer – "Strahlenverfolger").
Interpreter
Eine der Möglichkeiten, dem Rechner Quelltexte (also von Programmiererinnen geschriebenen Programmcode) verständlich zu machen. Der Interpreter nimmt sich des Quellcodes an und übersetzt ihn während der Programmausführung für den Computer. Der Interpreter der Skriptsprache Tcl heißt tclsh. Will man zudem Tk, die passende Bibliothek zum Erzeugen der Fensterelementen, nutzen, benötigt man an seiner Stelle die "Windowing Shell" wish.
Widgets
Abgeleitet von "window" und "gadget" ("Dingsbums") bezeichnet der Begriff Widget Fensterelemente wie z.B. Buttons, Schieberegler und Eingabefelder.
\
Da ein Zeilenumbruch in Tcl/Tk immer auch ein Befehlsende ist, muss ein Zeilenwechsel innerhalb eines Befehls maskiert werden. Dies geschieht durch einen Backslash (\). Nach diesem darf allerdings außer der Enter-Taste kein Zeichen mehr eingetippt werden – auch ein Leerzeichen führt zu einer Fehlermeldung.
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 Povray noch nicht haben, 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/home.html
[4] John Ousterhout, der "Erfinder" von Tcl/Tk, hat selbst ein sehr lesenswertes Buch 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
[] Der erste Teil dieser Programmiereinführung ist erschienen im: [7a] Linux-Magazin 04/2000, S. 120--124 und online abrufbar unter: [7b] http://www.linux-user.de/ausgabe/2000/06/TclTk1/tcl1.html
[8] Teil zwei können Sie nachlesen im: Linux-Magazin 06/2000, S. 148--153
[9] Linux-User 06/2000, S. 78--83
[9] Linux-Magazin 08/2000, S. 116--122
[10] Linux-User 08/2000, S. 30--36



