Grafik mit GnuPlot und Perl in HTML-Seiten
Theo
- multimedia (audio & video)
Hallo zusammen,
folgende Situation:
Ich möchte mit Perl und GnuPlot Grafiken "interaktiv" in einer HTML-Seite darstellen.
Dazu habe ich eine HTML Seite mit zwei Frames.
Im ersten ist im wesentlichen ein Formular enthalten, in welchem Pfade, Parameter etc. für den Plot festgelegt werden können. Diese Eingaben werden mittels "Plot-Button" und POST an ein Perl-Skript übergeben. Das Perl-Skript startet GnuPlot, der Plot wird generiert und in dem entsprechenden Verzeichnis abgespeichert. Das Perl-Skript generiert auch gleichzeitig wieder das HTML für das Formular, welches im ersten Frame angezeigt wird, so dass ich einen nächsten Plot generieren kann.
Soweit so gut.
Nun möchte ich, dass dieser Plot im zweiten Frame angezeigt werden soll.
Was ich schon probiert habe:
Den Plot gleichzeitig auch in einem fixen Verzeichnis z.B. unter dem Namen "NeuesterPlot.png" abspeichern. Der zweiten Frame enthält eine HTML-Datei mit dem Code
<img src="NeuesterPlot.png">
Wenn ich den aktuellen Plot sehen will dann muss ich allerdings erst den Refresh-Knopf drücken.
Im ersten Frame platziere ich einen Link mit
<a href="file:///d:/test/PlotView.html" target="Plot">Show</a>
Hier muss ich auch zuerst den Plot-Button und dann den Link drücken. Dabei wird der Plot nicht im zweiten Frame sondern in einem neuen Tabulator geöffnet.
Ich möchte im ersten Frame auf den Plot-Knopf drücken und anschliessend im zweiten Frame automatisch den generierten Plot sehen.
Wie kann man das realisieren? Das ist ja weniger eine Perl- oder GnuPlot- Frage als mehr eine HTML-Frage. Aber hier im Archiv habe ich nichts dazu gefunden.
Danke für hilfreiche Hinweise.
Theo.
Hallo Theo,
wäre der Verzicht auf Frames eine Option?
Gruß, Jürgen
Du kommst komplett ohne solche furchtbaren Hacks wie Frames und benannten Dateien aus. Benutze einfach ein einzelnes Dokument mit selbstadressiertem Formular und Bildausgabe.
use IPC::Run qw(run);
use Plack::Request qw();
use URI qw();
use autodie qw(:all run);
my $plotheader = <<'PLOTHEADER';
set term png size 600, 400
plot '-'
PLOTHEADER
my $template = <<'HTML';
<!DOCTYPE html>
<html><head><title>Gnuplot-Demo</title>
<style>textarea { display: block; width: 5em; height: 10em; }</style>
</head><body>
<form action="%s">
<textarea name="plot">
1 1
2 4
3 9
4 16
5 25
</textarea>
<input type="submit">
</form>
%s
</body></html>
HTML
my $app = sub {
my ($env) = @_;
my $req = Plack::Request->new($env);
my $in = $req->param('plot');
my $img = q();
if ($in) {
$in = $plotheader . $in;
my $out;
run ['gnuplot'], \$in, \$out;
my $u = URI->new('data:');
$u->media_type('image/png');
$u->data($out);
$img = qq(<img src="$u" alt="">);
};
my $res = $req->new_response(
200,
[Content_Type => 'text/html'],
[sprintf $template, $req->uri, $img]
);
$res->finalize;
};
Danke JürgenB und CPAN.
Ja, Frames braucht es nicht, es geht auch ohne. Das Problem ist damit eigentlich gelöst :-)
@CPAN Danke für das komplette Beispiel. Deine Lösung ist sicher elegant, doch verstehen tue ich sie (noch) nicht und testen kann ich sie nicht, weil IPC::Run nicht gefunden wird. Warum auch immer...? Anfängerpech... :-(
Internal Server Error: Can't locate IPC/Run.pm in @INC (@INC contains: C:/Programme/Perl/lib/Win32 C:/Program Files/Perl/site/lib C:/Program Files/Perl/lib .)
Im Verzeichnis "C:\Program Files\Perl\lib\Win32" gibt es allerdings die Datei IPC.pm
Ich hatte angenommen, du wärst Programmierer. Du musst die abhängigen Module installieren, siehe http://stackoverflow.com/questions/65865/whats-the-easiest-way-to-install-a-missing-perl-module und http://www.cpan.org/modules/INSTALL.html.
Du startest das Programm lokal mit
plackup gnuplot-demo.psgi
Wenn du es in einer CGI-Umgebung ausbringen möchtest, lies http://p3rl.org/Plack::Handler::CGI.