reaper9187 has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I have a problem i need help with. I need to use a frame to recreate charts based on inputs from the user. I have no problems generating the charts for the first time. But when i try to reuse the same frame space for a new chart, I end up expanding the frame size and the new chart is appended to the existing window. Could you please suggest some ways to do it ??
Thanks,..!!! Here is an example code:
#!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Chart::Lines; use Tk::Chart::Areas; my $mw = MainWindow->new( -title => 'Tk::Chart::Lines example', -background => 'white', ); my $chart = $mw->Lines( -title => 'My graph title', -xlabel => 'X Label', -ylabel => 'Y Label', )->pack(qw / -fill both -expand 1 /); my @data = ( [ '1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th' ], [ 1, 2, 5, 6, 3, 1.5, 1, 3, 4 ], [ 4, 2, 5, 2, 3, 5.5, 7, 9, 4 ], [ 1, 2, 52, 6, 3, 17.5, 1, 43, 10 ] ); # Add a legend to the graph my @legends = ( 'legend 1', 'legend 2', 'legend 3' ); $chart->set_legend( -title => 'Title legend', -data => \@legends, -titlecolors => 'blue', ); # Add help identification $chart->set_balloon(); # Create the graph $chart->plot( \@data ); sleep(2); $chart->clearchart; my $chart = $mw->Areas( -title => 'My graph title', -xlabel => 'X Label', -ylabel => 'Y Label', )->pack(qw / -fill both -expand 1 /); my @data1 = ( [ '1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th' ], [ 1, 2, 5, 6, 3, 1.5, 1, 3, 4 ], [ 4, 2, 5, 2, 3, 5.5, 7, 9, 4 ], [ 1, 2, 52, 6, 3, 17.5, 1, 43, 10 ] ); # Add a legend to the graph my @legends1 = ( 'legend 1', 'legend 2', 'legend 3' ); $chart->set_legend( -title => 'Title legend', -data => \@legends1, -titlecolors => 'blue', ); # Add help identification $chart->set_balloon(); # Create the graph $chart->plot( \@data1 ); MainLoop();

Replies are listed 'Best First'.
Re: Canvas reuse for different chart in Tk:Chart
by zentara (Cardinal) on Nov 21, 2013 at 22:17 UTC
    The typical way to clear a canvas, is to use $canvas->delete('all'). So you can use $chart->delete('all'), since $chart is actually derived from a canvas. Below is a simple example. You might have trouble reloading it, if you switch from lines to bars, or whatever, but I'm not deleving that far into it. The advice above, to packforget it, then repack a new one is more foolproof, but delete('all') will allow you the possibility to reuse the canvas. Also packforget and repacking may lead to a memory gain if you do it too many times, but I hav'nt tested that.
    #!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Chart::Pie; my $mw = MainWindow->new( -title => 'Tk::Chart::Pie example', ); my $chart = $mw->Pie( -title => 'There are currently 231 CPAN mirrors around the Worl +d (20/09/2010 18:50:57).', -background => 'white', -linewidth => 2, )->pack(qw / -fill both -expand 1 /); print "$chart\n"; # attempt to see if it is a Subwidget my $canvas = $chart->Subwidget('canvas'); print "$canvas\n"; my @data = ( [ 'Europe', 'Asia', 'Africa', 'Oceania', 'Americas' ], [ +119, 33, 3, 6, 67 ], ); $chart->plot( \@data ); my $cbutton = $mw->Button(-text => 'Clear', -command => sub{ # $canvas->delete('all'); $chart->delete('all'); })->pack(); MainLoop();

    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku ................... flash japh
Re: Canvas reuse for different chart in Tk:Chart (packForget)
by Anonymous Monk on Nov 21, 2013 at 08:47 UTC

    But when i try to reuse the same frame space for a new chart,

    First you have to get rid of the old canvas taking up the space, packForget it and destroy it