Tkinter pack difficulty
Russell E. Owen
rowen at cesmail.net
Wed Sep 12 21:15:04 CEST 2007
In article <1189617737.700363.187450 at g4g2000hsf.googlegroups.com>,
Simon Forman <sajmikins at gmail.com> 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)
More information about the Python-list