in reply to Re: Which tk to use and how to show images?
in thread Which tk to use and how to show images?

I think you are going to run into problems with this type of script, where you combine Tk and GD.

Hmm. Provided that you disard old things before creating new ones, the space should be reused.

I haven't put this in a tight loop and run it thousands of times, but I've clicked the button quite a lot (maybe a 100 times) whilst monitoring the memory, and I see no sign of a growth trend (on my system):

use Tk; use Tk::PNG; use MIME::Base64; use GD::Graph; use GD::Graph::bars; my $data = [ [qw/1st 2nd 3rd 4th 5th 6th 7th 8th 9th/], [qw/ 1 2 5 6 3 1.5 1 3 4/], ]; my $graph = GD::Graph::bars->new(400, 300); $graph->set( x_label => 'X Label', y_label => 'Y label', title => 'Some simple graph', y_max_value => 8, y_tick_number => 8, y_label_skip => 2 ) or die $my_graph->error; my $gd = $graph->plot($data) or die $my_graph->error; my $mw = MainWindow->new; my $png = $mw->Photo(-data => encode_base64($gd->png)); $mw->Button( -text => 'doit', -command => sub{ $data->[ 1 ] = [ map{ rand 5 } 1 .. 9 ]; undef $graph; $graph = GD::Graph::bars->new(400, 300); $graph->set( x_label => 'X Label', y_label => 'Y label', title => 'Some simple graph', y_max_value => 8, y_tick_number => 8, y_label_skip => 2 ) or die $my_graph->error; my $gd = $graph->plot($data) or die $my_graph->error; $png->blank; $png->configure( -data => encode_base64($gd->png) ); $mw->update; } )->pack; $mw->Label(-image => $png)->pack; MainLoop;

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^3: Which tk to use and how to show images?
by zentara (Cardinal) on Nov 04, 2005 at 17:40 UTC
    Yeah, you have it pretty close, by undef'ing $gd. I ran your code with a repeat and it leveled out after about 200 updates, only gaining about 200k, which is probably due to the total area of bar space displayed maxing out eventually. But I still think the plain canvas approach uses less cpu.

    I'm not really a human, but I play one on earth. flash japh
      But I still think the plain canvas approach uses less cpu

      Oh, I totally agree. If the graph is only ever to be displayed in Tk, and not re-used as an image elsewhere, a Canvas does make sense.

      That said, GD::Graph does do some stuff with scaling and ticks, labels and pie-charts that are not trivial to reproduce.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

        Plus if you wanted to make the graphs interactive (make elements in the graph responsive to Mouse events) within Tk, then it would be easier with Canvas implementation -- or Tk::Graph for that matter. I'd like to see that module adapted for Tk::Zinc. It would gain some nice additional capabilities over Canvas.

Re^3: Which tk to use and how to show images?
by Sinatra (Novice) on Nov 14, 2005 at 14:10 UTC
    It would appear you guys are good, I was wondering what would happen to the memory usage. Being new to perl I assumed the garbage collector would cleanup after me (that is what they are for) but I've had problems with programs using to much memory. I'm re-drawing the graph every two seconds over four or five hours and it's been getting a bit slow. I've now added the approiate undef and so far it's looking better.
    Has anyone seen my bint?