Tkinter pack difficulty

Russell E. Owen rowen at
Wed Sep 12 21:15:04 CEST 2007

In article <1189617737.700363.187450 at>,
 Simon Forman <sajmikins at> wrote:

> Hi all,
> I realize this is more of a Tk question than a python one, but since
> I'm using python and don't know Tcl/Tk I figured I'd ask here first
> before bugging the Tcl folks.
> I am having a terrible time trying to get a pack() layout working.
> I have three frames stacked top to bottom and stretching across the
> master window from edge to edge.
> Crude ASCII Art rendition of the frames:
> ============
> |  header  |
> ------------
> |   body   |
> ------------
> |   log    |
> ============
> I want the header and log frames to have a fixed height (and stick to
> the top and bottom, respectively, of the master frame) and the body
> frame to expand to fill the rest of the space, for instance if the
> window is maximized.
> Here is a simple script that /almost/ does what I want.   I've been
> tweaking the pack() options for three hours and I just can't seem to
> get the effect I want.  This /can't/ really be this hard can it?
> If you run the script, be aware that since there are only frame
> widgets the window will initially be very very tiny.  If you expand or
> maximize the window you'll see a thin black frame at the top, yay, a
> thin white frame at the bottom, yay, but the middle grey "body" frame
> will NOT span the Y axis, boo.
> It's there, and stretches from side to side, but it refuses to stretch
> top to bottom.  Adding a widget (say, a Text) doesn't help, the light
> grey non-frame rectangles remain.
> My investigations seem to indicate that the light grey bars are part
> of something the Tk docs call a "parcel" that each slave widget gets
> packed into.  Apparently the "header" and "log" frames don't use their
> entire parcels, but I don't know how to get the parcels themselves to
> "shrinkwrap" to the size of the actual Frame widgets.
> In any event,  my head's sore and I'm just about ready to take out
> some graph paper and use the grid() layout manager instead.  But I
> really want the automatic resizing that the pack() manager will do,
> rather than the static layout grid() will give me.

The grid layout manager is the obvious choice for this and it is 
dynamic. (There is a place geometry manager that works with coordinates, 
but I don't recommend that for this case).

Grid the top/middle/bottom frame in row = 0/1/2, column = 0
then use row_configure to set the weight of the middle frame to 1.
You may also have to set sticky to "news" when you grid all the frames.

In general I suggest you use grid unless it's something simple like a 
row of buttons.

But never try to both grid and pack anything into the in the same parent 
widget. You'll get a crash or an infinite loop. (You can grid frames 
that have widgets packed inside them, but you can't grid grid some items 
into a frame and then pack some more into the same frame)

-- Russell

More information about the Python-list mailing list