Box packing is really simple, so perhaps your failure to understand it is because you imagine it is more complicated than it is.
Layout is either Vertical (like a pile of bricks) or horizontal (like a queue of people). Each element in that layout can expand or it can not expand.
Horizontal (HBox)
[widget][widget][widget][widget]
Vertical (VBox)
[widget]
[widget]
[widget]
[widget]
So for example, a Horizontal layout (HBox) with two buttons, which the code would be:
import gtk
box = gtk.HBox()
b1 = gtk.Button('button1')
b2 = gtk.Button('button2')
box.pack_start(b1)
box.pack_start(b2)
Now since the default for packing is to have expand=True
, both those buttons added to the box will expand and they will each occupy half the area. No matter what the size of the container is. I think of this as "stretchy".
Expanding widgets:
[[ widget ][ widget ]]
So, if you want one of the buttons to not expand, you will pack it like this:
box.pack_start(b1, expand=False)
Non-expanding widget:
[[widget][ widget ]]
Then the button will only occupy the space it needs to draw itself: text + borders + shadows + images (if any) etc. And the other button will expand to fill the remaining area. Normally, buttons don't need to be expanded, so a more real-life situation is a TextArea which you would want to expand to fill the window.
The other parameter that can be passed to pack_start
is the fill parameter, and normally this can be ignored. It is enough here to say that if expand=False
then the fill
parameter is entirely ignored (because it doesn't make sense in that situation).
The other thing you mentioned is set_size_request
. I would generally say that this is not a good idea. I say generally, because there are situations where you will need to use it. But for someone beginning out with packing a GTK+ user interface, I would strongly recommend not using it. In general, let the boxes and other containers handle your layout for you. The set_size_request
does not do exactly what you would expect it to do. It does not change the size of a widget, but merely how much space it will request. It may use more, and may even stretch to fill larger spaces. It will rarely become smaller than the request, but again because it is just a "request" there is no guarantee theat the request will be fulfilled.