Читать книгу Desarrollo de interfaces gráficas en Python 3 con Tkinter - Tomás Domínguez Mínguez - Страница 24
5.2 TEMPORIZADORES
ОглавлениеEn este grupo se encuentran los métodos relacionados con la invocación de funciones una vez transcurrido un intervalo de tiempo determinado. El principal es aquel con el que se establece el temporizador:
after(intervalo, función)
Dicho método llamará a la función indicada en el segundo argumento cuando haya pasado el número de milisegundos establecido en el primero. De forma opcional, este método puede tener más argumentos, que serían con los que se invocaría la función.
Si no se incluyera una función, el comportamiento sería similar al de la función sleep() del módulo time de Python.
Siempre que sea necesario aplazar la ejecución de una función, deberá llamar a este método para no bloquear la aplicación en el punto donde se realice la temporización. Eso provocaría que la interfaz dejara de atender los eventos del usuario, como si hubiera dejado de funcionar. Por ese motivo, se debe evitar el uso de la función sleep() del módulo time de Python, que tampoco podría llamarse dentro de un thread, porque Tkinter no funciona adecuadamente con dicho módulo. Aunque existen formas de hacer que trabajen conjuntamente, lo más sencillo es usar el método after().
El resultado devuelto por este método es un identificador, que podría usarse para cancelar posteriormente el temporizador con este otro método:
after_cancel(id temporizador)
Para practicar con estos métodos, va a desarrollar un programa en el que aparezca una frase que aumente de tamaño continuamente hasta alcanzar un máximo, a partir del cual empezará a disminuir; así, hasta que alcance un tamaño mínimo, momento en el que comenzará a crecer otra vez, repitiéndose de nuevo el ciclo.
El código del programa es el siguiente:
Lo primero que se hace es importar las clases necesarias; en este caso, Tk y Label. Con la primera, se creará la ventana principal y, con la segunda, el texto que irá cambiando de tamaño:
A continuación, se declaran las variables utilizadas para parametrizar el comportamiento del programa. Con incremento, se establece el cambio de tamaño experimentado por el texto (en píxeles) cada vez que transcurra el número de milisegundos almacenado en periodo. Cuanto más grande sea el valor de incremento y/o más pequeño el del de periodo, mayor será la velocidad a la que crezca o disminuya el tamaño del texto. Las variables tamanio_max y tamanio_min contienen el tamaño máximo y mínimo que puede tener la fuente, cuyo valor actual se guardará en tamanio:
De momento, salte la función modifica_tamanio() para continuar con las sentencias en las que se crea la ventana principal (root), a la que se asigna un tamaño de 400 × 200 píxeles. A continuación, se crea la etiqueta con una fuente de tipo Arial y en negrita, cuyo tamaño será el contenido en la variable tamanio:
Una vez creada la etiqueta, se muestra centrada en la ventana principal, para lo cual se asigna el valor True a la opción expand:
Por último, se llama a la función modifica_tamanio(), encargada de cambiar el tamaño del texto (su fuente) de forma continuada:
Por lo tanto, ha llegado el momento de describir el código que contiene. En primer lugar, se declaran como globales las variables tamanio e incremento, porque son compartidas en todas las invocaciones de esta función:
La primera sentencia de esta función determina el signo del incremento, y lo cambia cuando se alcanza el valor máximo o mínimo. De esta forma, se consigue el efecto de crecimiento y decrecimiento continuo del tamaño del texto, cuyo valor se calcula en la segunda sentencia:
Dicho valor se traslada a la etiqueta con el método configure() a través de la opción font, con el fin de mostrar en pantalla el texto con el nuevo tamaño:
Por último —y lo más importante a efectos de esta práctica—, se invoca el método after(), para volver a llamarse a sí misma transcurrido el tiempo indicado por la variable periodo. La ejecución recursiva de esta función será la que consiga que el tamaño del texto cambie continuamente:
El resultado obtenido al ejecutar este programa puede verse reflejado en la siguiente secuencia de imágenes: