En este ejemplo, la base de todos los widgets es una caja vertical, que a su vez es hija
de la ventana. Los widgets hijos no se muestran de modo homogéneo y no hay un espacio adicional
(diferente del espaciado estándar).
Hay seis cajas horizontales en la caja vertical, tal y como se definen con la función
makeBox, que tiene el tipo mostrado. Además, hay dos etiquetas en la caja vertical
así como dos separadores horizontales. El último widget es el botón Quit
cuya señal onClicked se engancha a la función mainQuit.
Los separadores se crean con hSeparatorNew y están espaciados por boxPackStart
con un espacio de separación de diez píxeles. Las etiquetas (label) se crean con labelNew
con un Maybe String y su posición se establece con miscSetAlignment para estar
justificados a la izquierda y arriba.

La función makeBox :: Bool -> Int -> Packing -> Int -> IO
HBox demuestra como los widgets de Gtk2Hs encajan dentro del sistyema de tipos de haskell.
Packing es simplemente un tipo, como Int y Bool
y IO HBox es como IO String en el típico IO.
La función crea cinco botones, los etiqueta con el texto apropiado y los empaqueta en una
caja horizontal. Entonces la función se emplea en el programa principal para crear los modos de
empaquetado deseados.
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
vbox <- vBoxNew False 0
set window [containerBorderWidth := 10,
windowTitle := "Packing Demonstration",
containerChild := vbox]
label1 <- labelNew (Just "hBoxNew False 0")
miscSetAlignment label1 0 0
boxPackStart vbox label1 PackNatural 0
box1 <- makeBox False 0 PackNatural 0
boxPackStart vbox box1 PackNatural 0
box2 <- makeBox False 0 PackRepel 0
boxPackStart vbox box2 PackNatural 0
box3 <- makeBox False 0 PackGrow 0
boxPackStart vbox box3 PackNatural 0
sep1 <- hSeparatorNew
boxPackStart vbox sep1 PackNatural 10
label2 <- labelNew (Just "hBoxNew True 0")
miscSetAlignment label2 0 0
boxPackStart vbox label2 PackNatural 0
box4 <- makeBox True 0 PackNatural 0
boxPackStart vbox box4 PackNatural 0
box5 <- makeBox True 0 PackRepel 0
boxPackStart vbox box5 PackNatural 0
box6 <- makeBox False 0 PackGrow 0
boxPackStart vbox box6 PackNatural 0
sep <- hSeparatorNew
boxPackStart vbox sep PackNatural 10
quitbox <- hBoxNew False 0
boxPackStart vbox quitbox PackNatural 0
quitbutton <- buttonNewWithLabel "Quit"
boxPackStart quitbox quitbutton PackRepel 0
onClicked quitbutton mainQuit
onDestroy window mainQuit
widgetShowAll window
mainGUI
makeBox :: Bool -> Int -> Packing -> Int -> IO HBox
makeBox homogeneous spacing packing padding = do
box <- hBoxNew homogeneous spacing
button1 <- buttonNewWithLabel "boxPackStart"
boxPackStart box button1 packing padding
button2 <- buttonNewWithLabel "box"
boxPackStart box button2 packing padding
button3 <- buttonNewWithLabel "button"
boxPackStart box button3 packing padding
button4 <- case packing of
PackNatural -> buttonNewWithLabel "PackNatural"
PackRepel -> buttonNewWithLabel "PackRepel"
PackGrow -> buttonNewWithLabel "PackGrow"
boxPackStart box button4 packing padding
button5 <- buttonNewWithLabel (show padding)
boxPackStart box button5 packing padding
return box
La imagen de abajo muestra los efectos de modificar el tamaño de la ventana horizontalmente. En el primer grupo, con homogeneous en False, las modificaciones horizontales dejan la frimera fila de botones como estaban, espacian la segunda fila de modo equilibrado y agrandan los botones de la tercera fila. En el segundo grupo, los botones se empaquetan homogeneamente, y las primeras dos filas se verán iguales. Si modificamos el tamaño verticalmente, simplemente añadirá espacios adicionales al final, ya que la caja vertical ha sido inicializada con False.
