Pack

El comando help(tkinter.Pack) proporciona buena información sobre esta clase y los métodos que tienen todos los widgets estudiados en esta asignatura. Literalmente nos indica que tkinter.Pack es la clase base para utilizar todos los métodos que comienzan con pack_ en los widgets declarados en una aplicación.

Métodos

config = pack_configure(self, cnf={}, **kw)
configure = pack_configure(self, cnf={}, **kw)
forget = pack_forget(self)
info = pack_info(self)
pack = pack_configure(self, cnf={}, **kw)
pack_configure(self, cnf={}, **kw)
pack_forget(self)
pack_info(self)
pack_propagate(self, flag=['_noarg_'])
pack_slaves(self)
propagate = pack_propagate(self, flag=['_noarg_'])
slaves = pack_slaves(self)

Si colocamos un widget con el método pack sin argumentos se empaquetará con los atributos por defecto de esta clase. Para conocer estos argumentos por defecto basta con usar en el widget su método pack_info, que devuelve la siguiente información:

{'in': <tkinter.Tk object .>,
'anchor': 'center',
'expand': 0,
'fill': 'none',
'ipadx': 0,
'ipady': 0,
'padx': 0,
'pady': 0,
'side': 'top'}

Por defecto, el widget se ha anclado en el centro y en la parte superior, de ahí que cuando colocamos varios widgets vemos que aparecen todos centrados horizontalmente y cada widget se ha colocado en la parte superior del hueco que aún no contiene widgets en el contenedor utilizado.

La ayuda de Python nos da esta información en la descripción del método pack_configure:

pack_configure(self, cnf={}, **kw)
    Pack a widget in the parent widget. Use as options:

    after=widget - pack it after you have packed widget

    anchor=NSEW (or subset) - position widget according to
                              given direction

    before=widget - pack it before you will pack widget

    expand=bool - expand widget if parent size grows

    fill=NONE or X or Y or BOTH - fill widget if widget grows

    in=master - use master to contain this widget

    in_=master - see 'in' option description

    ipadx=amount - add internal padding in x direction

    ipady=amount - add internal padding in y direction

    padx=amount - add padding in x direction

    pady=amount - add padding in y direction

    side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.

Básicamente, podemos controlar si el widget se coloca antes o después de determinado widget, si se ancla al centro, norte, sur, este u oeste (o cualquier combinación de ellos), si se expande cuando se redimensiona el widget que lo contiene, si se rellena horizontal o verticalmente, en qué widget está contenido, qué espacios internos y externos tiene y en qué lado del espacio libre que tiene su contenedor se ha de situar.

Ejemplo 1 (atributo side)

Hasta ahora hemos utilizado el método pack sin parámetros, es decir, con los valores que utiliza por defecto. Veamos cuáles son desarrollando una aplicación con cuatro etiquetas bien diferenciadas, colocadas en un par de frames.

import tkinter as tk
import tkinter.ttk as ttk

v_principal = tk.Tk()

frame_1 = ttk.Frame(v_principal)

ttk.Label(frame_1, text="Uno").pack()
ttk.Label(frame_1, text="Dos").pack()

frame_1.pack()

frame_2 = ttk.Frame(v_principal)

ttk.Label(frame_2, text="--- Uno ---").pack()
ttk.Label(frame_2, text="--- Dos ---").pack()
ttk.Label(frame_2, text="--- Tres ---").pack()
ttk.Label(frame_2, text="--- Cuatro ---").pack()

frame_2.pack()

v_principal.mainloop()

Al redimensionar la aplicación se observa que los widgets están, todos, uno encima de otro y centrados horizontalmente. En parte se debe a que por defecto están asociados al lado TOP de su contenedor.

Si modificamos la opción side del primer frame vemos cuál es el efecto:

side=tk.LEFT

frame_1.pack(side=tk.LEFT)

Aparentemente quedan uno al lado del otro, en el mismo orden en que se han colocado. El primer frame se coloca a la izquierda de la ventana y el segundo en la parte superior (por defecto). Si redimensionamos vemos que no tienen la misma alineación horizontal.

side=tk.RIGHT

frame_1.pack(side=tk.RIGHT)

Ahora da la sensación de que se ha cambiado el orden de colocación, al aparecer a la derecha el segundo frame. Se debe a que el primer frame se ha colocado en la parte derecha de la ventana.

side=tk.BOTTOM

frame_1.pack(side=tk.BOTTOM)

Parece como si se hubieran colocado en orden inverso a la primera situación. El redimensionado muestra que el primero se mueve con la parte inferior de la ventana y el segundo con la superior (valor por defecto del atributo side).

Probemos ahora con ambos frames, en lugar de tener 4 situaciones distintas tendremos 16, no las comentaré todas en estos apuntes.

side=tk.LEFT en ambos

frame_1.pack(side=tk.LEFT)
...
frame_2.pack(side=tk.LEFT)

Queda uno al lado del otro, en el mismo orden en que se han colocado. El primer frame se coloca a la izquierda de la ventana y el segundo también, después de haber colocado el primero.

side=tk.LEFT y side=tk.RIGHT

frame_1.pack(side=tk.LEFT)
...
frame_2.pack(side=tk.RIGHT)

Queda uno al lado del otro, en el mismo orden en que se han colocado. El primer frame se coloca a la izquierda de la ventana y el segundo a la derecha.

side=tk.LEFT y side=tk.TOP

Ya lo hemos visto.

side=tk.LEFT y side=tk.BOTTOM

frame_1.pack(side=tk.LEFT)
...
frame_2.pack(side=tk.BOTTOM)

Queda uno al lado del otro, en el mismo orden en que se han colocado. El primer frame se coloca a la izquierda de la ventana y el segundo en la parte inferior.

Prueba tú el resto de combinaciones para descubrir cómo gestionar la apariencia de tus aplicaciones.

Ejemplo 2 (atributo anchor)

Por defecto tiene el valor CENTER, como hemos comprobado en el ejemplo anterior. Un widget puede anclarse a cualquiera de los puntos cardinales W, E, N, S, de su contenedor.

Prueba todas las combinaciones de este atributo con ambos frames. Una vez te has hecho una idea del efecto que produce, combina distintos valores de side con distintos valores de anchor.

Ejemplo 3 (atributo fill)

Veamos ahora el efecto del atributo fill, con el que pedimos que el widget crezca horizontal o verticalmente en función de su posición y anclaje y del resto de widgets del contenedor.

Puede tomar los valores NONE (por defecto), X, Y y BOTH.

Ejemplo 4 (atributo expand)

Veamos ahora el efecto del atributo expand.

results matching ""

    No results matching ""