Читать книгу Desarrollo de interfaces gráficas en Python 3 con Tkinter - Tomás Domínguez Mínguez - Страница 10

3.1 EL GESTOR DE GEOMETRÍA PACK

Оглавление

Este gestor de geometría distribuye los widgets en horizontal o en vertical. Para utilizarlo, se tiene que invocar el siguiente método, común a todos ellos:


Las opciones disponibles son las siguientes:

•expand. Establece el espacio que el gestor de geometría asignaría al widget dentro de la ventana principal (o widget contenedor). Si su valor fuera True, sería el máximo disponible.

•fill. Determina si el widget debe ocupar todo el espacio asignado por el gestor de geometría o mantiene sus propias dimensiones. En el último caso, el valor que tomaría esta opción sería NONE (predeterminado). Por el contrario, si pudiera crecer/disminuir para ocupar el área máxima disponible, se debería indicar si lo haría a lo ancho (X), a lo alto (Y), o en ambas direcciones (BOTH).

•side. De forma predeterminada, este gestor de geometría ubica los widgets de arriba hacia abajo (su valor es TOP). Aquí se puede cambiar esta forma de organizarlos para que se coloquen de abajo hacia arriba (BOTTOM), de izquierda a derecha (LEFT) o de derecha a izquierda (RIGHT).


Recuerde que, para usar cualquier constante, previamente deberá haberla importado del módulo Tkinter. También puede usar directamente el valor que tiene cada una de ellas (por ejemplo, el de BOTTOM es "bottom", a TOP le correspondería "top", etc.).

Para que pueda entender el funcionamiento conjunto de estas opciones, en las siguientes imágenes (tomadas de https://stackoverflow.com/questions/28089942/difference-between-fill-and-expandoptions-for-tkinter-pack-method) se puede apreciar el efecto producido por estas opciones sobre una etiqueta, cuyo texto indica los valores asignados a cada una de ellas.

En la primera, el valor de la opción expand es False:


En esta segunda, el valor de la opción expand es True:


Como puede observar, muchas de las combinaciones de las tres opciones dan los mismos resultados, lo que indica que podrían obviarse. Así, por ejemplo, el resultado de la primera fila, en el que la etiqueta aparece centrada en la ventana, se podría conseguir utilizando únicamente la opción:


Además de las opciones anteriores, las siguientes opciones permiten separar un widget de los límites de la ventana principal (o widget contenedor) y del resto de los widgets:

•ipadx. Número de píxeles con los que se rellena el widget horizontalmente, dentro de sus bordes.

•ipady. Número de píxeles con los que se rellena el widget verticalmente, dentro de sus bordes.

•padx. Número de píxeles con los que se rellena el widget horizontalmente, fuera de sus límites.

•pady. Número de píxeles con los que se rellena el widget verticalmente, fuera de sus límites.

En la siguiente imagen, puede ver gráficamente cómo afectan estas opciones a la posición de una etiqueta (situada en la esquina superior izquierda de la ventana principal) y al texto que contiene (justificado a la izquierda). Se supone que, al crear tanto la ventana como la etiqueta, se han fijado sus dimensiones de forma explícita:


Si no se hubieran indicado las dimensiones de la ventana, esta se ajustaría a las de los widgets que contuviera (en este caso, a las de la etiqueta). Por el mismo motivo, si no se hubiera especificado el ancho y el alto de la etiqueta, su tamaño correspondería al del texto que contuviera. La imagen de más abajo muestra gráficamente el resultado obtenido en ese caso:


Por último, para dejar de mostrar un widget en la ventana principal (o widget contenedor), se debe ejecutar el método:


Si quisiera volver a mostrar dicho widget, seguramente que no lo haría en la misma posición donde se encontraba antes de desaparecer, sino en aquella que le asigne el gestor de geometría una vez invocado el método pack() del resto de widgets.

Para probar el funcionamiento de este gestor de geometría, puesto que el único widget que conoce por ahora son las etiquetas, creará cuatro etiquetas que distribuirá de dos formas diferentes. En primer lugar, lo hará según el comportamiento por defecto, es decir, de arriba hacia abajo:


Lo primero que se debe hacer es importar las clases que se van a utilizar del paquete Tkinter (Tk y Label):


Luego, se crea la ventana principal:


Acto seguido, se hace lo mismo con las cuatro etiquetas:


Finalmente, se muestran en la ventana con el método pack(). Estas se rodean con un borde de un grosor de 10 píxeles de ancho y 5 de alto. Eso hace que la primera etiqueta se aleje del límite superior de la ventana 5 píxeles (tal como se indicó en la opción pady), al igual que la última etiqueta del borde superior. Sin embargo, la separación vertical entre etiquetas es de 10 píxeles (5 del superior y 5 del inferior). Con los límites derecho e izquierdo de la ventana también se mantiene un espacio de 10 píxeles, tal como se ha establecido en la opción padx:


El resultado, como cabía esperar, son las cuatro etiquetas colocadas unas debajo de otras. La imagen de la izquierda muestra el resultado de la ejecución del programa, mientras que la imagen de la derecha muestra gráficamente el efecto de las opciones padx y pady, con las que se han separado las etiquetas de los límites de la ventana principal y entre sí:



Al utilizar las opciones padx y pady, ya no es necesario incluir los retornos de carro (carácter ‘\n’) ni los espacios en el texto de la etiqueta.


Para que el espacio que se establezca a la derecha de un widget sea diferente que el de la izquierda, asigne una tupla con dos valores a la opción padx. Esto mismo es igualmente válido para la opción pady.

En el siguiente programa, se utiliza la opción side para situar las etiquetas en cada uno de los lados de la ventana:


De nuevo, se importan las clases Tk y Label de la librería Tkinter, pero, en este caso, también se hace lo mismo con las constantes TOP, BOTTOM, LEFT y RIGHT, que determinarán la posición de cada una de las etiquetas:


Para que el efecto sea más visible, una vez creada la ventana principal, esta se configura con un tamaño de 200 × 200 píxeles:


Las etiquetas se crean de la misma forma que en el programa anterior, por lo que no se van a dar explicaciones adicionales.

El principal cambio se produce al mostrarlas en la ventana principal con el método pack(), ya que ahora se añade la opción side para fijar la posición en la que se va a situar cada una de ellas. Además, dependiendo del lado de la ventana en el que se coloquen, se utilizarán las opciones padx o pady para separarlas del borde:


Ejecute el programa. Obtendrá el resultado mostrado en la siguiente imagen:


Desarrollo de interfaces gráficas en Python 3 con Tkinter

Подняться наверх