When creating an application, you'll want to put more than one widget inside a window. Our first helloworld example only used one widget so we could simply use window.add to "pack" the widget into the window. But when you want to put more than one widget into a window, how do you control where that widget is positioned? This is where packing comes in.
Most packing is done by creating boxes. These are invisible widget containers that we can pack our widgets into which come in two forms, a horizontal box, and a vertical box. When packing widgets into a horizontal box, the objects are inserted horizontally from left to right or right to left depending on the call used. In a vertical box, widgets are packed from top to bottom or vice versa. You may use any combination of boxes inside or beside other boxes to create the desired effect.
To create a new horizontal box, we use Gtk::HBox.new, and for vertical boxes, Gtk::VBox.new. The pack_start and pack_end methods are used to place objects inside of these containers. pack_start will start at the top and work its way down in a vbox, and pack left to right in an hbox. pack_end will do the opposite. Using these functions allows us to right justify or left justify our widgets and may be mixed in any way to achieve the desired effect. An object may be another container or a widget. In fact, many widgets are actually containers themselves, including the button, but we usually only use a label inside a button.
By using these calls, GTK knows where you want to place your widgets so it can do automatic resizing and other nifty things. There are also a number of options as to how your widgets should be packed. As you can imagine, this method gives us a quite a bit of flexibility when placing and creating widgets.