zentara,
I can buy the packForget/re-pack in lieu of ->destroy. On the other hand, if I don't want something on my screen - just disabling it isn't going to cut it.
Out of curiosity, would you mind showing a complete example of Tk::ProgressBar attached to the main window (along with other frames, menus, and other widgets) which disappears after the task is completed? That's what I used ->destroy for but would rather not have.
| [reply] |
Just to broaden your horizons a bit, Perl/Gtk2 has a neat way to handle it. You can set an entrie frame or widget to visible(0) or visible(1). That way you can multiple widgets located in one screen spot, and choose which one to show. packForgetting is clumsy compared to that. For an example of progressbar, see Tk-with-worker-threads. I made my own progressbar in that, because the regular Tk::Progressbar widget leaks memory on reuse, probably because it uses Photo objects internally, that leave refcounts behind. But the following works pretty well.
#!/usr/bin/perl
use strict;
use Tk;
use Tk::ProgressBar;
#dosn't leak
my $mw=MainWindow->new;
$mw->geometry('+100+100');
my $tframe = $mw->Frame->pack();
my $pro_on = 0;
my $count = 0;
my $label = $tframe->Label(
-text => 'Show Progress',
)->pack(-side => 'left', -padx => 5);
my $cb = $tframe->Checkbutton(
-activebackground => "white",
-variable => \$pro_on,
-command => [ \&display_pro ]
)->pack(-side => 'left');
my $bframe = $mw->Frame->pack();
my $pb = $bframe->ProgressBar(
-height => 0,
-width => 20,
-length => 100,
-colors=>[0,'blue'],
-blocks=>100,
-variable => \$count,
)->pack();
# need to pack then unpack them to get right window size
my @w = $bframe->packSlaves;
foreach (@w) { $_->packForget; }
MainLoop;
sub display_pro {
print $pro_on,"\n";
if($pro_on){
$count = 0;
$bframe->pack();
$pb->pack();
# $mw->packPropagate;
# $mw->update;
show_progress();
}else{
my @w = $bframe->packSlaves;
foreach (@w) { $_->packForget; }
$bframe->packForget;
}
}
sub show_progress{
my $timer;
$timer = $mw->repeat(100,sub{
$count++;
$pb->value($count);
$mw->update;
if($count == 100){$timer->cancel}
});
}
__END__
| [reply] [d/l] |