in reply to Integrating TK and Chart::Gnuplot.

From reading Chart::Gnuplot, I guess that the terminal => 'windows' option makes Gnuplot itself display a window. Your Tk program will halt until that Gnuplot window is closed. Either make Chart::Gnuplot output a PNG (or whatever) image and display that in Tk, or find a way to make Chart::Gnuplot return control to your main program immediately.

Replies are listed 'Best First'.
Re^2: Integrating TK and Chart::Gnuplot.
by Ppeoc (Beadle) on Mar 06, 2016 at 16:04 UTC
    Thanks Corion. Any idea how I can make Chart::Gnuplot return control to the main program?

      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.
      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. :)