Die Kommandozeile macht sich schön (2)

Einführung in Tcl/Tk, Teil 4

01.10.2000
In der vierten und letzten Folge dieser Tcl/Tk-Einführung fügen wir der in Teil drei entstandenen Steuerungsoberfläche für Povray Funktionalität hinzu und erwecken sie so zum Leben.

In Abbildung 1 ist die im dritten Teil dieser Einführung erzeugte Oberfläche zur Steuerung des Raytracers Povray zu sehen. Bisher tut sie allerdings noch nichts außer sich selbst zu beenden, wenn Sie mit der Maus auf den Menübutton Datei-->Beenden klicken.

Abbildung 1: Die Oberfläche der Povray-Steuerung

Der Quelltext für das komplette grafische Benutzerinterface inklusive der Funktionen, die diesmal hinzu gefügt werden, ist in Listing 1 abgedruckt. Sie können ihn abschreiben, in einer Datei namens povgui speichern, mit chmod +x povgui ausführbar machen und aufrufen – vorausgesetzt, Sie haben sich nicht verschrieben und Ihr Tcl/Tk-Interpreter hört auf den Namen wish. Eventuell müssen Sie den Aufruf exec wish "$0" in Zeile 3 durch exec wish8.0 "$0" oder eine andere Versionsnummer ersetzen, je nachdem, wie Tcl/Tk auf Ihrem System installiert ist. Die Funktionen, die wir im Folgenden hinzu fügen, sind im Kasten "Die Funktionen von povgui" zusammen gestellt.

Die Funktionen von <I>povgui<I>

  • Bei einem Mausklick auf den Menüpunkt Datei-Szenendatei soll
  • ein Dateibrowser erscheinen, in dem die Datei mit der Szenenbeschreibung ausgewählt werden kann.
  • povgui aus dem Dateinamen der Szenendatei einen Vorschlag für den Namen der von Povray zu erzeugenden Bilddatei erstellen, der dann im Eingabefeld Bildname erscheint.
  • Klickt man auf den Button Rendern, so soll
  • Povray mit den Namen der Szenen- und Bilddateien sowie Angaben zur Bildgeometrie aufgerufen werden.
  • Wird der Button Anzeigen mit der Maus aktiviert, soll
  • das gerenderte Bild von einem Bildbetrachtungsprogramm angezeigt werden.
  • Mit den Schiebereglern für Bildbreite und Bildhöhe soll
  • die Geometrie des zu rendernden Bilds eingestellt werden können.
  • Im Eingabefeld Bildname soll
  • der Vorschlag von povgui für den Namen der Bilddatei angezeigt werden und
  • dieser vom Benutzer geändert werden können.

In dieser Aufzählung sind auch schon die benötigten Variablen erkennbar:

  • der Name der Szenendatei,
  • der Name der Bilddatei,
  • die Breite und
  • die Höhe des Bilds.Genau diese Variablen wurden bereits im zweiten Artikel [8,9] benötigt, doch diesmal werden sie – etwas eleganter – in einem Array organisiert.

Arrays

Unter Feldern oder Arrays versteht man Zusammenstellungen von Variablen unter einem einheitlichen Namen. Sie bestehen aus dem Array-Namen und dem Namen der jeweiligen Elemente, wobei jedes Array-Element eine Variable ist.

Im Gegensatz zu anderen Programmiersprachen, bei denen Elementbezeichner als fortlaufender Index dienen und daher natürliche Zahlen sein müssen, können in Tcl/Tk beliebige Zeichenketten als Namen für Elemente verwendet werden. Diese werden in runde Klammern eingeschlossen an den Arraynamen angehängt. (Leerzeichen in Elementnamen gelten als Zeichen!)

Um sich das Konzept klarer zu machen, halten Sie am Besten eine kleine Zwiesprache mit Ihrem Interpreter. Starten Sie dazu die wish in einem X-Terminal.

Nun können Sie z.B. ein Array arbeitszeit anlegen, in dem Sie für jeden Wochentag die von Ihnen geleistete Arbeitszeit speichern. Bei der Definition eines ersten Array-Elements wird gleichzeitig auch das Array selbst erzeugt.

billi@ratschni > wish
% # Definition des Arrays
% # und des Elements montag
% set arbeitszeit(montag) 6
6
% # Definition des Elements dienstag
% set arbeitszeit(dienstag) 9
9
% # Ausgabe der Arbeitszeit vom Montag
% puts "Am Montag habe ich $arbeitszeit(montag) Stunden gearbeitet"
Am Montag habe ich 6 Stunden gearbeitet
% exit
billi@ratschni >

Die Zeilen mit einem Gatter (#) am Anfang sind übrigens Kommentarzeilen und dienen nur zur Erläuterung; der Interpreter "übersieht" sie.

Für das Povray-Interface ist es sinnvoll, ein Array mit dem Namen pov o.ä. anzulegen, in dem die benötigten Variablen als Array-Elemente unter gebracht werden. Die Variablen für Bildhöhe und Bildbreite können Sie bei dieser Gelegenheit schon mal mit einem Vorgabewert versehen (Zeile 6--9 in Listing 1):

set pov(szene)  ""
set pov(bild)   ""
set pov(breite) 400
set pov(hoehe)  200

Drei dieser Variablen lassen sich direkt mit den Widgets verknüpfen, mit deren Hilfe die Benutzer die darin abgelegten Werte ändern können:

  • pov(bild) mit dem Eingabefeld,
  • pov(breite) mit dem Breitenregler und
  • pov(hoehe) mit der Höhenregler.

Ein Eingabefeld (entry) kann mit der Option -textvariable name_der_variablen (Zeile 74) versehen werden. Jeder Wert, den name_der_variablen annimmt, wird dann im Eingabefeld dargestellt. Umgekehrt bekommt die Variable auch den Wert, den der Benutzer im Eingabefeld eingibt.

Schieberegler (scale) kennen die Option -variable name_der_variablen (Zeile 76 und 78). Auch hier beeinflussen sich die Stellung des Reglers und der Wert der Variablen gegenseitig. Ändert sich der Variableninhalt, so bewegt sich der Regler wie von Geisterhand auf den neuen Wert. Wird der Regler verschoben, ändert sich auch der Variablenwert.

Nun können Sie auch den Anzeigen-Button aus Abbildung 1 mit einem Kommando beglücken. Er soll den Bildbetrachter xv samt dem Namen der Bilddatei aufrufen. Da es sich dabei um den Aufruf eines externen Unix-Programms handelt, muss diesem ein exec voran gehen. Um das Interface nicht so lange zu blockieren, wie xv läuft, wird der Befehl durch ein hintangestelltes Kaufmannsund (&) im Hintergrund gestartet. Der komplette Befehl lautet somit exec xv $pov(bild) & (Zeile 49).

Ähnlich können Sie nun das Kommando zum Zusammenstellen der povray-Befehlszeile an den Rendern-Button anknüpfen (Zeile 45 und 46):

exec povray +I$pov(szene) +O$pov(bild) +W$pov(width) +H$pov(height) &

Wenn Sie sich nun dem letzten zu versorgenden Widget, dem Menüpunkt Szenendatei wählen ... im Menü des Datei-Menübuttons, zuwenden, stellen Sie fest, dass dieser bei einem Mausklick ziemlich viele Dinge zu tun hat. Er muss einen Dateimanager öffnen, die darin ausgewählte Datei in der Variablen pov(szene) speichern und den Vorschlag für den Dateinamen der Bilddatei generieren.

Wie die meisten Widgets kennt auch ein Eintrag in einem Pull-Down-Menü die Option -command, mit der Sie den Button Befehle ausführen lassen können. Wenn Sie aber die oben aufgeführten Aktionen in eine -command-Option packen, sieht das höchst unschön aus. Das muss auch nicht sein, denn es gibt in Tcl die Möglichkeit, mehrere Befehle in einer Extra-Sequenz zusammen zu stellen und diese Sequenz als eigenen Befehl aufzurufen. Diese Konstruktion wird Prozedur genannt.

Prozeduren

Eine Tcl/Tk-Prozedur besteht aus vier Teilen und wird mit dem Befehl proc eingeleitet:

proc ProzedurName {eventuelle Argumente} { Rumpf mit den Befehlen }

Durch die Angabe von Argumenten können Sie der Prozedur Variablen mit auf den Weg geben. Falls Sie dies nicht möchten, bleibt die erste Klammer leer, muss aber mit aufgeschrieben werden.

Die im zweiten geschweiften Klammernpaar zusammen gestellten Befehle können Sie durch Angabe des Prozedurnamens ausführen. Falls Sie Argumente definiert haben, müssen diese bei einem Prozeduraufruf immer mit angegeben werden.

Verdeutlichen Sie sich dies am besten durch Interaktion mit dem Interpreter. Bis zur öffnenden Klammer des Prozedurrumpfes muss alles in eine einzige Zeile geschrieben werden. Im Prozedurrumpf selbst können Sie dann beliebig viele Leerzeilen einfügen.

billi@ratschni > wish
% # Definition der Prozedur "schreibe"
% # mit einem Argument: text.
% proc schreibe { text } { puts $text }
%
% # Aufruf der Prozedur mit einem Argument.
% schreibe "Was für ein schöner Tag"
Was für ein schöner Tag
%
% # Ohne Argument läuft nix.
% schreibe
no value given for parameter "text" to "schreibe"
%
% # Neudefinition von "schreibe",
% # diesmal mit zwei Argumenten.
% proc schreibe { text1 text2 } {puts $text1puts $text2}
%
% # Erneuter Aufruf
% schreibe "Das Leben" "ist schön"
Das Leben
ist schön
% exit
billi@ratschni >

Variablen innerhalb einer Prozedur haben eine Besonderheit: Sie sind nur innerhalb der Prozedur – also lokal – vorhanden:

billi@ratschni > wish
% # Definition der Prozedur "versteckt"
% proc versteckt { } { set gruss Ciao }
%
% # Setzen des gruss-Inhalts
% # ausserhalb der Prozedur.
% set gruss Hallo
Hallo
%
% # Aufruf der Prozedur
% # zum Aendern des grusses
% versteckt
%
% # Aber gruss bleibt gruss...
% puts $gruss
Hallo
% exit
billi@ratschni >

Die Variable gruss innerhalb der Prozedur versteckt und die außerhalb der Prozedur definierte Variable mit dem selben Namen sind unterschiedliche Variablen, die nichts von einander wissen und sich gegenseitig nicht beeinflussen.

Die Möglichkeit, inner- und außerhalb einer Prozedur auf die gleiche Variable zuzugreifen, hat man, wenn die Variable als global definiert ist:

billi@ratschni > wish
% proc sichtbar { } {global grussset gruss Ciao}
%
% # Definition von gruss
% # ausserhalb der Prozedur.
% set gruss Hallo
Hallo
%
% # Aufruf der Prozedur
% # zum Aendern des grusses
% sichtbar
%
% # Jetzt hat sich der gruss geandert
% puts $gruss
Ciao
% exit
billi@ratschni >

Mit diesem Wissen gerüstet, können Sie nun eine Prozedur anlegen, die Sie mit dem Menübutton verknüpfen und – da sie ja im Wesentlichen für die Auswahl einer Datei zuständig sein wird – dateiAuswahl nennen. Innerhalb dieser Prozedur müssen Sie das Array pov als global deklarieren, damit Sie von Innen wie Außen auf die selben Variablen zugreifen.

proc dateiAuswahl { } {
    global pov
    # Anstelle dieses Kommentars
    # kommen gleich die Befehle
}

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • Einführung in Tcl/Tk, Teil 2
    Nachdem Sie im ersten Teil dieses Programmierkurses einen ersten Einblick in den Umgang mit Tcl/Tk gewinnen konnten, werden Sie diesmal tiefer in die Strukturen von Tcl eintauchen. Die dabei gewonnenen Fähigkeiten können Sie dazu verwenden, Kommandozeilenprogrammen eine intuitivere, auf Ihre persönlichen Bedürfnisse zugeschnittene Benutzerschnittstelle zu spendieren.
  • Einführung in Tcl/Tk, Teil 3
    Nachdem Sie im ersten Teil dieses Programmierkurses gesehen haben, wie einfach sich Buttons mit Tcl/Tk programmieren lassen, und im zweiten mehr über die Skriptsprache Tcl lernen konnten, werden Sie diesmal eine etwas aufwändigere grafische Oberfläche erstellen.
  • Frontends für Povray
    Mit Povray lassen sich wunderschöne virtuelle Welten erschaffen. Das richtige Frontend erleichtert die Bedienung, beschleunigt die Entwicklung und erhöht den Spaßfaktor.
  • Einführung in Tcl/Tk, Teil 1
    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.
Kommentare

Infos zur Publikation

title_2014_08

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 1 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...
o2 surfstick software für ubuntu?
daniel soltek, 15.07.2014 18:27, 1 Antworten
hallo zusammen, habe mir einen o2 surfstick huawei bestellt und gerade festgestellt, das der nic...
Öhm - wozu Benutzername, wenn man dann hier mit Klarnamen angezeigt wird?
Thomas Kallay, 03.07.2014 20:30, 1 Antworten
Hallo Team von Linux-Community, kleine Zwischenfrage: warum muß man beim Registrieren einen Us...
openSUSE 13.1 - Login-Problem wg. Fehler im Intel-Grafiktreiber?
Thomas Kallay, 03.07.2014 20:26, 8 Antworten
Hallo Linux-Community, habe hier ein sogenanntes Hybrid-Notebook laufen, mit einer Intel-HD460...
Fernwartung für Linux?
Alfred Böllmann, 20.06.2014 15:30, 7 Antworten
Hi liebe Linux-Freunde, bin beim klassischen Probleme googeln auf www.expertiger.de gestoßen, ei...