In article <[EMAIL PROTECTED]>, Simon Forman <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list