473,505 Members | 14,136 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Tkinter pack difficulty

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()

Sep 12 '07 #1
4 4150
On Wednesday 12 September 2007 13:22, Simon Forman 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.

Any thoughts or advice?
Sorry I can't help you with pack, I don't use it anymore.

I am able to do everything with grid that I can do with pack.
Once I learned to use grid I liked it better than pack.
Spend some time to learn grid you may like it.
I'm sure others will disagree, but for me it works for everything I
need.

jim-on-linux
http://inqvista.com
>
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()
Sep 12 '07 #2
On Sep 12, 6:22 pm, Simon Forman <sajmik...@gmail.comwrote:
Hi all,

SnipAny thoughts or advice?

Thanks in advance,
~Simon
This seems to do what you want, the difference is that the expand
option is left out top and bottom, also I increased height and put in
a width value as well:
from Tkinter import *

t = Tk()

header = Frame(t, bg="black", height=30, width = 10)
header.pack(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=30, width = 10)
log.pack( fill=X, side=BOTTOM, anchor=S)

t.mainloop()

Ciao
Tony

Sep 12 '07 #3
In article <11**********************@g4g2000hsf.googlegroups. com>,
Simon Forman <sa*******@gmail.comwrote:
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
Sep 12 '07 #4
Thanks everyone for the incredibly helpful replies! I got the effect
I wanted, no problem. I don't know why I didn't think to remove the
expand option. I thought the sticky option would constrain the
expansion.

Thanks again,
~Simon

Sep 17 '07 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
2069
by: John Fouhy | last post by:
Hi all, I have been attempting to change the title bar icon of my Tkinter applications in Windows XP. Chasing round in google, I discovered: - This is a common difficulty. - There aren't any...
1
2952
by: syed_saqib_ali | last post by:
Please take a look at and run the code snippet shown below. It creates a canvas with vertical & Horizontal scroll-bars. If you shrink the window to smaller than the area of the canvas, the...
0
3565
by: syed_saqib_ali | last post by:
Below is a simple code snippet showing a Tkinter Window bearing a canvas and 2 connected scrollbars (Vertical & Horizontal). Works fine. When you shrink/resize the window the scrollbars adjust...
1
3585
by: Michael Yanowitz | last post by:
Hello: Below I have included a stripped down version of the GUI I am working on. It contains 2 dialog boxes - one main and one settings. It has the following problems, probably all related, that...
2
2311
by: jim-on-linux | last post by:
py help, The file below will run as a stand alone file. It works fine as it is. But, when I call it from another module it locks my computer, The off switch is the only salvation. This...
2
4097
by: Kevin Walzer | last post by:
I'm trying to construct a simple Tkinter GUI and I'm having trouble with getting the value of an entry widget and passing it onto a callback function. But I'm not grokking variable scope correctly....
1
1856
by: Kevin Walzer | last post by:
I'm trying to create a custom Tkinter widget class, and I'm having some difficulty getting it set up properly. The class is called MacToolbar, saved in its own module MacToolbar.py, and imported...
4
2149
by: MartinRinehart | last post by:
Everything I've read about Tkinter says you create your window and then call its mainloop() method. But that's not really true. This is enough to launch a default window from the console: ...
3
3900
by: J-Burns | last post by:
Hello. Im a bit new to using Tkinter and im not a real pro in programming itself... :P. Need some help here. Problem 1: How do I make something appear on 2 separate windows using Tkinter? By...
0
7216
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7098
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
1
7018
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
1
5028
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
4699
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
0
3176
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
1528
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
1
754
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
407
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.