http://qs1969.pair.com?node_id=942174


in reply to resizing problem with Tk appl using PackForget

one tip, when describing the problem widgets, use the variable names from the code you post

When you pack, you forget to pack( qw/ -fill both  -expand 1 / ), and without those arguments, the widgets won't grow with resizing

If you make it into a widget, you can reuse this thing :)

Replies are listed 'Best First'.
Re^2: resizing problem with Tk appl using PackForget
by monger_39 (Initiate) on Dec 07, 2011 at 07:56 UTC
    Hi Anonymous,

    // thx for the tip

    Your hint indeed fixed to resize the hidden widgets to their original state. Do you perhaps know of an easy way to store/remember the pack arguments for each widget? In my real app the pack arguments are more diverse. What do you mean by "if you make it into a widget" ??

    This does leave the problem that after a resize, the 'hide' action does not minimize the container frame. Any idea how to get that fixed?

    thx David

      Do you perhaps know of an easy way to store/remember the pack arguments for each widget?

      Make it a widget (read object)

      my $rememberer = MakeHideDaddyChildButton( -buttonDaddy => $top_frame, -hidersDaddy => $mw, # gets resized -hiders => [ $top_frame, $middle_frame ], #daddys kiddys ); $rememberer->pack;

      This does leave the problem that after a resize, the 'hide' action does not minimize the container frame. Any idea how to get that fixed?

      Um, repack the container frame (or its parent, or mainwindow ) .... or better idea, only ever forget/repack the container frame

      Might need to resize (->geometry)

      I'd have posted an example, but I was already working on this one, keep shooting, and watch the canvas resize :) the mainwindow doesn't resize

      #!/usr/bin/perl -- use strict; use warnings; use Tk; my $packArgs = do { my @packargs = ( [ qw/-expand 0 / ], [ qw/-expand 1 -fill x / ], [ qw/-expand 1 -fill y / ], [ qw/-expand 1 -fill both / ], ); my $ix = -1; my $xx = @packargs ; sub { $ix++; warn $ix % $xx ; return @{ $packargs[ $ix % $xx ] }; }; }; my $mw = tkinit; $mw->Button( -text => 'BANG!', -command => \&bangBang )->pack(qw/-side top -anchor n/); my $ca = $mw->Canvas( background => 'white' ) ->pack( $packArgs->() ); $ca->createOval( 50, 50, 100, 100, -fill => 'pink', ); MainLoop; exit 0; sub bangBang { my $b = $Tk::event->W; $mw->Busy; $b->configure(-state => "disabled"); my $text = $b->cget(qw/ -text /); unless( $text =~ s/(\d+)/ $1 + 1 /e ){ $text .= " 1"; } $b->configure( -text => $text); $ca->packForget; $mw->update; sleep 1; $ca->pack( $packArgs->() ); $mw->Unbusy; $b->configure(-state => "normal"); $mw->update; }
        I like the packArgs trick. Also easy to add an arg to the sub for selecting one of the options.

        the canvas within this BANG app resizes fine for each of the chosen packArgs.

        But pls try this:
        * split the PackForget() and pack() over 2 buttons (show, hide) one containing the packForget, the other the pack
        * start the app, and resize the main window
        * then hit 'hide'

        The canvas and mainwindow are not resized.
        I seem to be missing the point about the resizing through a call to geometry. Can't find a hint in the docs either.