Desarrollo de interfaces gráficas en Python 3 con Tkinter. Tomás Domínguez Mínguez
Чтение книги онлайн.
Читать онлайн книгу Desarrollo de interfaces gráficas en Python 3 con Tkinter - Tomás Domínguez Mínguez страница 6
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.
Unidad 3
POSICIONAMIENTO Y DISEÑO
En el programa anterior, la interfaz se componía de un único widget. Pero, en la práctica, hasta la aplicación más sencilla que desarrolle requerirá más de uno. En ese caso, ¿cómo se indicaría la posición que debe ocupar cada uno de ellos en la ventana principal? La respuesta es haciendo uso de alguno de los tres gestores de geometría proporcionados por Tkinter:
•pack. Organiza los widgets horizontal o verticalmente (por defecto, de arriba hacia abajo).
•grid. Distribuye los widgets en cuadrícula, con una estructura similar a una tabla. Es el recomendado en interfaces gráficas complejas.
•place. Coloca los widgets en coordenadas concretas.
Los gestores de geometría se utilizan tanto para distribuir los widgets en la ventana principal como dentro de otros widgets contenedores (por ejemplo, los frames y los paneles que conocerá más adelante).
Veamos en detalle cómo funciona cada uno de ellos.
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