Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re^2: Integrating TK and Chart::Gnuplot.

by Ppeoc (Beadle)
on Mar 06, 2016 at 16:04 UTC ( [id://1156931]=note: print w/replies, xml ) Need Help??


in reply to Re: Integrating TK and Chart::Gnuplot.
in thread Integrating TK and Chart::Gnuplot.

Thanks Corion. Any idea how I can make Chart::Gnuplot return control to the main program?
  • Comment on Re^2: Integrating TK and Chart::Gnuplot.

Replies are listed 'Best First'.
Re^3: Integrating TK and Chart::Gnuplot.
by Corion (Patriarch) on Mar 06, 2016 at 16:21 UTC

    Looking at the source code of Chart::Gnuplot, I see that it calls the program as:

    my $err = `$cmd 2>&1`;

    So basically, it will always wait until $cmd finishes. You can try to reconfigure/replace $cmd by a command that launches Gnuplot in the background and then immediately returns. This would return control to your program, but will always launch a new instance of the gnuplot program for each diagram you want to display I imagine.

    I fear the only way to integrate things more into your program is to make gnuplot return image data and to render that yourself. But maybe by reading the documentation or the source code you find a way that I missed.

      Thanks for the idea. I am not that proficient in perl to figure this out on my own. But it should be a good place for me to start.
Re^3: Integrating TK and Chart::Gnuplot.
by graff (Chancellor) on Mar 06, 2016 at 21:31 UTC
    My suggestion would be to go with the first option that Corion mentioned above: have gnuplot save its image to a file instead of opening its own display window. I gather you've had success already with using something like this:
    my $chart = Chart::Gnuplot->new( output => 'test.png', # not "terminal => 'windows'" ...
    That way, gnuplot will exit as soon as the file is written, and then you just have to load the file into a new Tk::Toplevel window. I'd be inclined to make the file name different on each "plot" call - e.g. rename "test.png" to some new unique name after calling plot3d, and use the new name to label and load the new Toplevel window, like this:
    my $output_id = 0; # put this before the MainLoop call ... sub plot { $chart->plot3d($dataSet); my $newname = sprintf( "test_%03d.png", ++$output_id ); rename( "test.png", $newname ); my $top = $mw->Toplevel( -title => $newname ); my $img = $top->Photo( -file => $newname ); my $lbl => $top->Label( -image => $img )->pack; }
    (updated to adjust file name in second paragraph)
      This is a very smart solution! Thank you. :)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1156931]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (3)
As of 2024-04-25 17:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found