Tkinter pack difficulty

Simon Forman sajmikins at gmail.com
Wed Sep 12 13:22:17 EDT 2007


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.

Any thoughts or advice?

Thanks in advance,
~Simon

# Tkinter script
from Tkinter import *

t = Tk()

header = Frame(t, bg="black", height=10)
header.pack(expand=1, fill=X, side=TOP, anchor=N)

body = Frame(t, bg="grey")
body.pack(expand=1, fill=BOTH, anchor=CENTER)

log = Frame(t, bg="white", height=10)
log.pack(expand=1, fill=X, side=BOTTOM, anchor=S)

t.mainloop()




More information about the Python-list mailing list