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
.