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

Unidad 2 LA VENTANA PRINCIPAL

Оглавление

Todos los widgets de una interfaz gráfica se organizan en una estructura jerárquica, cuyo nivel superior está ocupado por la ventana principal (main window en inglés), en la que se encuentran todos ellos. En Tkinter, esta se representa mediante la clase Tk, cuyo constructor es:



La forma más común de invocar este constructor es sin argumentos, aunque dispone de screenName, baseName, className y useTk.

La ventana principal contendrá tanto widgets elementales (por ejemplo, etiquetas, botones, etc.) como widgets contenedores (por ejemplo, frames, paneles, etc.). Estos últimos podrán incluir, a su vez, otros widgets básicos y/o contenedores, en cuyo caso se añadiría un nuevo nivel a la jerarquía.

La siguiente imagen muestra, de forma esquemática, una interfaz compuesta de una etiqueta y un frame que, a su vez, contiene otra etiqueta y un botón:


El diseño de esta interfaz se representa como una jerarquía de widgets con una estructura en árbol, tal como puede ver en la siguiente imagen:



Curiosamente, en informática las estructuras en árbol tienen la raíz en la parte superior y las ramas en la inferior (crece hacia abajo).


Solo puede haber una instancia de la clase Tk, es decir, una ventana principal. Si su aplicación requiriese varias ventanas, tendría que hacer uso de la clase Toplevel (se estudia más adelante).

El método principal de la clase Tk es:


Este método es el encargado de arrancar el bucle que atiende los eventos que se producen en la interfaz de la aplicación (como, por ejemplo, la pulsación de un botón, la selección de la opción de un menú, etc.).


El método mainloop() hace que la aplicación entre en un bucle infinito de espera y atención de eventos. Hasta que no se cierre la ventana principal, no se saldrá de él y, por lo tanto, no se ejecutará el código que hay a continuación de la sentencia que lo llama. Por ese motivo, se suele poner al final del programa. Si en un momento dado quisiera forzar la salida de este bucle, debería invocar el método quit().

Para poner un texto en la barra de título de la ventana, la clase Tk ofrece el método:


Si desea que la ventana tenga un tamaño determinado, use el método:


Tanto el ancho como el alto vendrán dados en píxeles; por ejemplo, para que una ventana tenga un tamaño de 200 píxeles de ancho y otros tantos de alto, el argumento de este método tendría el valor “200x200”.


Si no se indica un tamaño concreto, este se adapta al de los widgets que contiene.

Dicho tamaño podrá ser fijo e inmutable, o podrá ser modificado por el usuario a su gusto (comportamiento predeterminado). En este último caso, se podrá establecer que solo sea posible cambiar el ancho de la ventana, el alto o ambas dimensiones. La forma de hacerlo será invocando el método:


Ambos argumentos son de tipo booleano; uno permite modificar el ancho (primer argumento) y otro el alto (segundo argumento). Si su valor fuera True, podría hacerse; en caso contrario, no. Por lo tanto, si no quiere que el usuario redimensione la ventana, ambos argumentos deberán tomar el valor False.

Si se pudiera redimensionar la ventana, con los siguientes métodos se limitaría el tamaño mínimo y el máximo en cualquiera de sus dimensiones:


También en el caso de que sea posible cambiar el tamaño de la ventana, cuando la lógica del programa requiera saber sus dimensiones con objeto de ajustar su contenido, la forma de conocer el ancho y alto que tiene en un determinado momento sería mediante los métodos:


Para mostrar la ventana a pantalla completa, el método empleado sería:


Por el contrario, si lo que quiere es hacerla desaparecer de la pantalla (sin cerrarla), tendría que emplear alguno de estos métodos:


La diferencia entre ambos es que el primero hace desaparecer cualquier rastro de la ventana en la pantalla, mientras que el segundo la minimiza (se puede acceder a ella, por ejemplo, desde la barra de tareas de Windows).

Para volver a mostrarla, se usaría el método:


Cuando en la lógica de la aplicación fuera necesario conocer el estado de la ventana, el método empleado sería:


El valor devuelto por este método es:

•"normal ". La venta se muestra en pantalla de la forma habitual.

•"iconic". La ventana se muestra como un icono en la barra de tareas.

•"withdrawn". La ventana ha desaparecido de la pantalla, aunque no se ha cerrado.

•"zoomed". La ventana ocupa toda la pantalla.

Este método también se podría usar para establecer el estado de la ventana si se incluyera la opción newstate como argumento (sus valores serían los indicados anteriormente); por ejemplo, para maximizar la ventana de la aplicación, el método al que tendría que llamar de dicha ventana es:



Como habrá podido deducir, los métodos withdraw() e iconify() son equivalentes a state(newstate="withdrawn") y state(newstate="iconic"). Por la misma razón, deiconify() es equivalente a state(newstate="normal").

Si lo que quiere es cerrar la ventana (por ejemplo, cuando se ha pulsado un botón o la opción de salir de la aplicación), se llamaría al método:


De todos modos, la forma más común de cerrar una ventana es pulsando en el icono con forma de aspa que hay en su parte superior derecha. Para modificar ese comportamiento estándar (por ejemplo, avisando al usuario de que no se han guardado los cambios realizados en un fichero que se estaba editando), puede capturar el evento y realizar las tareas requeridas con el método:


En ese caso, en vez de cerrarse la ventana directamente, se ejecutaría la función cuyo nombre ha indicado en el segundo argumento.


El método protocol() se utiliza para la interacción entre la aplicación y el gestor de ventanas de su ordenador. Proporciona un mecanismo que intercepta eventos del sistema (primer argumento) para procesarlos de forma personalizada mediante una función, a la que se denomina “controlador de protocolo” (segundo argumento). De todos los posibles eventos que podrían capturarse, en los foros se indica que WM_SAVE_YOURSELF está obsoleto (evento que se lanza cuando la aplicación necesita guardar datos) y que tampoco es posible manejar correctamente WM_TAKE_FOCUS (la ventana coge el foco). Por lo tanto, solo se aconseja usar WM_DELETE_WINDOW.

A modo de ejemplo, el siguiente programa modifica su primera interfaz, con el fin de que la ventana principal tenga un tamaño inicial, que no podrá ser redimensionado a lo alto. Aunque sí podrá hacerlo a lo ancho; solo tendrá un margen entre 50 y 400 píxeles:


Como se ha comentado, el programa se basa en el desarrollado anteriormente (¡Hola Mundo!), por lo que solo se explicarán los cambios realizados sobre este. El primero es la incorporación de la sentencia que llama al método geometry() para establecer el tamaño inicial de la ventana en 200 × 50 píxeles:


A continuación, se invoca el método resizable(), cuyo segundo argumento tiene el valor False, lo que indica que la ventana no se puede redimensionar en el eje Y (a lo alto):


Las dos últimas sentencias que se han añadido establecen el ancho y el alto máximo y mínimo que puede tener la ventana principal. Puesto que con la sentencia anterior solo se permite redimensionarla a lo ancho, con estas limitará el tamaño entre 50 y 400 píxeles:


Ejecute el programa y pruebe que, efectivamente, el comportamiento de la ventana principal es el esperado.

Desarrollo de interfaces gráficas en Python 3 con Tkinter

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