in reply to Perl-tk Entry

Here comes a dose of wisdom for you Limbic~Region, :-)

If you destroy the entry, and try to redisplay it with the checkbutton click, you will gain memory. Tk will not clean up it's refcounts totally. So packForget the entry instead, then repack it it when the checkbutton is checked.

BUT, it usually is better for screen appearance to leave the entry widget in place, and just change it's state.

#!/usr/bin/perl use warnings; use strict; use Tk; my ( $entry, $cbvalue ); my $mw = tkinit; $mw->Checkbutton( -text => 'Use Entry widget below?', -variable => \$cbvalue, -command => \&SetState, )->pack; $entry = $mw->Entry->pack; SetState(); MainLoop; sub SetState { $entry->configure( -state => $cbvalue ? 'normal' : 'disabled' ); }

I'm not really a human, but I play one on earth CandyGram for Mongo

Replies are listed 'Best First'.
Re^2: Perl-tk Entry
by Limbic~Region (Chancellor) on Jul 16, 2008 at 15:38 UTC
    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.

    Cheers - L~R

      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__

      I'm not really a human, but I play one on earth CandyGram for Mongo