pack() and the division of vertical space

  • Thread starter christopherlmarshall
  • Start date
C

christopherlmarshall

I am trying to figure out how to stack two widgets in a frame
vertically so that they both expand horizontally and during vertical
expansion, the top one sticks to the top of the frame and the bottom
one consumes the remaining vertical space. I thought this would do it
but it doesn't. What am I missing?

from Tkinter import *

class AFrame(Frame):
def __init__(self,master,**config):
Frame.__init__(self,master,config)
size=50
self.l1= Label(text="abc",relief="groove")
self.l1.pack(side=TOP,expand=YES,fill=X,anchor=N)
self.l2= Label(text="abc",relief="groove")
self.l2.pack(side=TOP,expand=YES,fill=BOTH)

af= AFrame(None)
af.pack(side=TOP,expand=YES,fill=BOTH)
mainloop()
 
E

Eric Brunel

I am trying to figure out how to stack two widgets in a frame
vertically so that they both expand horizontally and during vertical
expansion, the top one sticks to the top of the frame and the bottom
one consumes the remaining vertical space. I thought this would do it
but it doesn't. What am I missing?
[snip code]

For this kind of stuff, don't use pack; use grid. It will be far easier to
get it working, to read afterwards and to maintain, even if it's slightly
more verbose. IMHO, pack should only be used to create rows or columns of
widgets, without any resizing policy, or to put an entire widget into a
container. If you do anything more complicated than that, you'll find grid
much easier to handle.

HTH
 
C

christopherlmarshall

I am trying to figure out how to stack two widgets in a frame
vertically so that they both expand horizontally and during vertical
expansion, the top one sticks to the top of the frame and the bottom
one consumes the remaining vertical space. I thought this would do it
but it doesn't. What am I missing?

[snip code]

For this kind of stuff, don't use pack; use grid. It will be far easier to
get it working, to read afterwards and to maintain, even if it's slightly
more verbose. IMHO, pack should only be used to create rows or columns of
widgets, without any resizing policy, or to put an entire widget into a
container. If you do anything more complicated than that, you'll find grid
much easier to handle.

HTH

Thanks, I basically came to the same conclusion shortly after writing
my post. I got it working with grid like this:

from Tkinter import *

class AFrame(Frame):
def __init__(self,master,**config):
Frame.__init__(self,master,config)
top= self.winfo_toplevel()
top.columnconfigure(0,weight=1)
top.rowconfigure(0,weight=1)
self.grid(row=0,column=0,sticky="NEWS")
self.rowconfigure(0,weight=0)
self.rowconfigure(1,weight=1)
self.columnconfigure(0,weight=1)
self.l1= Label(self,text="abc",relief="groove")
self.l1.grid(row=0,column=0,sticky="NEW")
self.l2= Label(self,text="abc",relief="groove")
self.l2.grid(row=1,column=0,sticky="NEWS")

af= AFrame(None)
mainloop()
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,438
Messages
2,571,699
Members
48,796
Latest member
Greg L.
Top