4.2. Las Cajas en detalle

A causa de esta flexibilidad, el empaquetado de cajas puede resultar confuso al principio, dado que admite muchas opciones cuyo funcionamiento conjunto no resulta obvio. Sin embargo, existen básicamente cinco estilos. La Figura 4.1, “Empaquetado: Cinco variaciones” muestra el resultado de la ejecución del programa packbox.py con un argumento de 1:

Figura 4.1. Empaquetado: Cinco variaciones

Empaquetado: Cinco variaciones

Cada línea contiene una caja horizontal (hbox) con varios botones. La llamada a pack es una copia de la llamada a pack en cada uno de los botones de la Hbox. Cada botón se empaqueta en la hbox de la misma manera (con los mismos argumentos al método pack_start() ).

Este es un ejemplo del método pack_start():

  box.pack_start(child, expand, fill, padding)

box es la caja donde se empaqueta el objeto. El primer argumento, child, es el objeto que se va a empaquetar. Por ahora los objetos serán botones, con lo que estaríamos empaquetando botones dentro de cajas.

El argumento expand de pack_start() y pack_end() controla si los controles se disponen de forma que ocupen todo el espacio extra de la caja y, de esta manera, ésta se expande hasta ocupar todo el área reservada para ella (TRUE); o si se encoge para ocupar el espacio justo de los controles (FALSE). Poner expand a FALSE permite justificar a la derecha y a la izquierda los controles. Si no, se expandirán para llenar la caja, y el mismo efecto podría obtenerse usando sólo o pack_start() o pack_end().

El argumento fill controla si el espacio extra se utiliza en los propios objetos (TRUE) o como espacio extra en la caja alrededor de los objetos (FALSE). Sólo tiene efecto si el argumento expand también es TRUE.

Python permite definir un método o función con valores de argumento predeterminados y argumentos con nombre. A lo largo de este tutorial se verá la definición de las funciones y métodos con valores predeterminados y argumentos con nombre cuando sean de aplicación. Por ejemplo, el método pack_start se define así:

  box.pack_start(child, expand=gtk.TRUE, fill=gtk.TRUE, padding=0)

  box.pack_end(child, expand=gtk.TRUE, fill=gtk.TRUE, padding=0)

child, expand, fill y padding son palabras clave (argumentos con nombre). Los argumentos expand, fill y padding tienen los valores predeterminados (o "por defecto") mostrados arriba. El argumento child debe especificarse obligatoriamente al no tener un valor predeterminado.

Las funciones que nos permiten crear una caja nueva son:

  hbox = gtk.HBox(homogeneous=gtk.FALSE, spacing=0)

  vbox = gtk.VBox(homogeneous=gtk.FALSE, spacing=0)

El argumento homogeneous de gtk.HBox() y gtk.VBox() controla si cada objeto de la caja tiene el mismo tamaño (por ejemplo, el mismo ancho en una hbox, o la misma altura en una vbox). Si se usa, las rutinas de empaquetado funcionan basicamente como si el argumento expand estuviera siempre activado.

¿Qué diferencia existe entre spacing (se fija al crear la caja) y padding (se determina al empaquetar los elementos)? El spacing se añade entre objetos, y el padding se añade a cada lado de un objeto. La Figura 4.2, “Empaquetado con Spacing y Padding” ilustra la diferencia, pasando un argumento de 2 a packbox.py :

Figura 4.2. Empaquetado con Spacing y Padding

Empaquetado con Spacing y Padding

La Figura 4.3, “Empaquetado con pack_end()” ilustra el uso del método pack_end() (pasa un argumento de 3 a packbox.py). La etiqueta "end" se empaqueta con el método pack_end(). Se mantendrá en el borde derecho de la ventana cuando ésta se redimensione.

Figura 4.3. Empaquetado con pack_end()

Empaquetado con pack_end()