Tk-Modul einbinden, nochmal
Christoph Schnauß
- perl
guten Tag, Forum ;-)
so, jetzt habe ich das Tk-Modul gluecklich in mein perl5.6 eingebaut, und mit ein paar Einschraenkungen funktioniert es auch beinahe. Diese "Einschraenkungen" beginnen damit, dass ich die "WidgetDemo" nicht aufrufen kann, aber doch ganz gerne wuesste, wie das geht. Konkret: unter den Hilfeseiten unter Perl/html gibt es ein sehr kurz gefasstes "UserGuide", in dem man gebeten wird, sich die Demo anzusehen, und unter Perl/site/lib/demos/widget_lib finden sich auch die etwas ueber 50 perl-files, die in der Demo gezeigt werden sollen. Bloss lassen die sich nicht individuell darstellen, sie sind abhaengig davon, dass sie von einem script "WidgetDemo.pl" aus gestartet und aufgerufen werden, und das Dingens existiert nicht. Es gibt im "UserGuide" einen ganz kleinen Absatz, wie sich der Quelltext dafuer basteln liesse, darin ist der wichtigste Hinweis, dass die Zeile "use Tk::WidgetDemo" im script stehen muss. Aber wenn man sich nun so ein scriptchen bastelt, gibts die Fehlermeldung, dass "WidgetDemo.pm" nicht gefunden wird. Dieses Teil liegt default unter Perl/site/lib/demos/widget_lib, aber egal, ob man das nun woandershin kopiert oder den Pfad z.B. nach "use Tk::irgendwas::irgendwas" aendert, "WidgetDemo.pm" wird nicht gefunden.
Na gut, das ist nicht ganz so tragisch, ich kenne den Demoinhalt von LINUX her, wo sich die Demo problemlos darstellen laesst. Ausserdem kann man ja die Quelltexte durchkucken. Eine zweite Sache macht mir mehr Sorgen: wieder von LINUX her kenne ich Perl-Tk-Applikationen, zum Teil sehr interessante, und habe selber ein paar zu stricken angefangen. Die Dateien lassen sich aber nicht 1:1 nach WINDOWS rueberziehen, und bisher war ich auch nicht auf die Idee gekommen, mal eine uebers "Netz", also ueber einen Webserver (Apache) aufzurufen. Jetzt habe ich das mal unter WINDOWS versucht, und da gibts was Eigenartiges. Als Beispiel habe ich "dirtree.pl" genommen (aus den Demos), der Code ist schoen kurz:
use Tk;
use Tk::DirTree;
my $top = MainWindow->new;
my $dl = $top->Scrolled('DirTree')->pack(-expand => 1 , -fill => 'both');
MainLoop;
ruft man das im "DOS-Fenster" mit "perl -w Verzeichnis\dirtree.pl" auf, gibt es eine kleine Listbox aus. Man kanns auch ueber einen Server (in diesem Fall IIS4) versuchen: "http://ServerName/cgi-Verzeichnis/dirtree.pl" bringts auch, aber - waehrend das Teil dargestellt wird, bleibt die Maus bei der "Sanduhr-Form" und in der Statuszeile des Browsers bleibt ein halber blauer Balken sichtbar. Wird die Applikation beendet, gibt es ploetzlich eine Fehlermeldung im Browser:
"Use of uninitialized value in concatenation (.) at D:/Perl/site/lib/Tk.pm line 350".
Diese Zeile im Modul sieht so aus: "$Home = $ENV{'HOME'} ($ENV{'HOMEDRIVE'}.$ENV{'HOMEPATH'});" - das heisst, wenn ich das Ganze richtig interpretiere, das kleine script findet meine Umgebungsvariablen nicht. Und an der Stelle weiss ich nicht weiter. Moeglicherweise muss ich in die autoexec.bat irgendwas eintragen, was mit "HTTP.PROXY..." beginnt (mein Rechner, auf dem ich scripts durchprobiere, laeuft ueber einen Proxy), aber das weiss ich nicht. Ich kann natuerlich die Umgebungsvariablen abfragen, da kommt (drastisch verkuerzt) folgendes:
%ENV:
PROMPT = $p$g
LOCAL_ADDR = 192.168.1.1
...
GATEWAY_INTERFACE = CGI/1.1
WINDIR = C:\WIN98
TMP = C:\TEMP
SERVER_SOFTWARE = Microsoft-IIS/4.0
PATH_INFO = /cgi-bin/test.pl
...
SERVER_NAME = ph1
..
PATH = C:;C:\WIN98;C:\WIN98\COMMAND;D:;D:\MICROSOFT\TRANSACTIONSERVER;D:\CCOMPILER\BIN;D:\JAVA\BIN;D:\PERL\BIN;D:\TCL\BIN;D:\TCLPRO1.3\WIN32-IX86\BIN
SERVER_PORT = 80
Bei einer gezielten Abfrage mit
$Daten=$ENV{'HOME'}
print "$Daten=$ENV{'HOME'}";
bekomme ich allerdings nix zu sehen. Und jetzt weiss ich nicht weiter.
Und nochwas. Eins der ueblichen Test-scripts:
use strict;
use Tk;
my $main = MainWindow->new;
$main->Label(-text => 'Hello, world!')->pack;
$main->Button(-text => 'Quit', -command => [$main => 'destroy'])->pack;
MainLoop
Ich habe versucht, das mal von einem anderen Rechner aus (auf dem kein Perl installiert ist) uebers Kabel aufzurufen. Da passiert im Browser gar nix; aber das kleine "hello world"-Fensterchen geht ploetzlich auf dem Server auf, auch wenn dort gar kein Browser aktiv ist. Wird es geschlossen, gibts auch im Client-Browser die oben genannte Fehlermeldung. Wie bekomme ich nun perl-scripts mit Tk-Code "webtauglich" ? Das zentrale Problem ist, dass "MainLoop" grundsaetzlich auf dem Server ausgefuehrt wird, aber ich will das Ergebnis natuerlich auf dem Client sehen. Denn ohne "Webtauglichkeit" kann ich das Script-Basteln auch sein lassen, dann ist es nur Selbstbefriedigung...
Entschuldigt meine Ausfuehrlichkeit, kuerzer hab ichs halt nicht hingekriegt.
Christoph S.
aber ich will das Ergebnis
natuerlich auf dem Client sehen. Denn ohne "Webtauglichkeit" kann ich das Script-Basteln auch
sein lassen, dann ist es nur Selbstbefriedigung...
Hallo Christoph!
Das tk-Modul dient meines Wissens dazu, eine graphische Oberfläche für Perl zu schaffen, ich glaube,
das ist mehr für "Stand-alones" als fürs Web gedacht, denn dann hast Du doch den Browser als
graphische Oberfläche zur Verfügung.
Gruß Torsten
Hallo Christoph!
Das tk-Modul dient meines Wissens dazu, eine graphische Oberfläche für Perl zu schaffen,
richtig, das ist eine der Aufgaben von perlTk. Aber die Widgets koennen noch eine ganze Menge mehr.
ich glaube,
das ist mehr fuer "Stand-alones" als fuers Web gedacht, denn dann hast Du doch den Browser als
graphische Oberfläche zur Verfügung.
nicht ganz richtig, da der Browser ja darauf angewiesen ist, dass ihm "gesagt" wird, wie er die Oberflaeche gestalten soll. Das kann man mit HTML sagen, oder eben auch ueber perlTK.
Andrerseits kann man mit perlTk tatsaechlich sehr komplexe "standalones" erstellen, der Oberbegriff dafuer ist "Widgets".
Christoph S.
nicht ganz richtig, da der Browser ja darauf angewiesen ist, dass ihm "gesagt" wird, wie er die Oberflaeche gestalten soll. Das kann man mit HTML sagen, oder eben auch ueber perlTK.
Hallo Christoph!
Bisher dachte ich immer, der Browser ließe sich nur durch HTML (und JavaScript) sagen, wie er etwas anzuzeigen hat, da muß ich mich wohl mal eingehender über das tk-Modul informieren...
Gruß Torsten
Bisher dachte ich immer, der Browser ließe sich nur durch HTML (und JavaScript) sagen, wie er etwas anzuzeigen hat, da muß ich mich wohl mal eingehender über das tk-Modul informieren...
Es gibt noch eine ganze Menge mehr Moeglichkeiten, Browsern bzw. einem "Explorer" mitzuteilen, was er wie machen soll. Bei perlTk kommt hinzu, dass es nicht zwingend darauf angewiesen ist, dass ein Browser aktiv ist, es geht auch "ohne".
Das Ganze ist in der WINDOWS-Welt noch nicht sehr etabliert. Aber es gibt fuer LINUX seit laengerer Zeit allerhand interessante Entwicklungen, wobei man "standalones", also "echte" Applikationen, doch besser mit der Scriptsprache Tcl machen sollte - Tk ist urspruenglich eine Erweiterung dafuer.
Christoph S.