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:
5.3 GESTIÓN DEL FOCO
El siguiente grupo de métodos está relacionado con el foco de un widget, es decir, con la entrada de datos por teclado:
•focus_get(). Devuelve el widget que tiene el foco en una aplicación. Si no lo tuviera ninguno, devolvería None.
•focus_set(). Pone el foco en un widget determinado.
•tk_focusFollowsMouse(). Fuerza que el foco esté donde se encuentre el ratón.
•tk_focusNext(). Devuelve el widget que sigue en la secuencia transversal del foco.
•tk_focusPrev(). Devuelve el widget que precede en la secuencia transversal del foco.
Recuerde que la secuencia transversal del foco está formada por los widgets por los que va pasando cuando se pulsa el tabulador.
La práctica que va a realizar en esta ocasión es un juego donde se muestra una ventana con cuatro campos. Al iniciar el programa, el foco se encuentra en el primer campo y, a partir de ese momento, cambia de forma aleatoria entre el de arriba y el de abajo. El objetivo es ser capaz de escribir correctamente una determinada palabra en todos ellos. Si se confundiera al añadir alguno de sus caracteres, el juego finalizaría, deshabilitándolos y mostrando un mensaje en color rojo que indicaría que el reto no ha sido conseguido. En caso contrario, el mensaje de acierto se mostraría en color verde.
El código del programa es el siguiente:
En primer lugar, se importa todo aquello que se va a utilizar. En concreto, de Tkinter se va a necesitar la clase Tk para crear la ventana principal, Entry para los campos de texto y Label para los mensajes de éxito o fracaso. De la librería random se importa la función randint(), para generar números aleatorios:
Luego, se declaran las variables de configuración. La primera (texto) almacena el texto que deberá escribirse correctamente en todos los campos para completar el juego. La segunda (periodo) es el tiempo que permanecerá el foco en un campo antes de cambiar al siguiente. Cuanto menor sea su valor, en milisegundos, más dificultad entrañará el juego:
Salte la declaración de la función, que se describirá más adelante, hasta encontrar las sentencias en las que se crea la ventana principal (root); se le asigna un texto a su barra de título y se impide que pueda redimensionarse:
A continuación, se crean los campos de texto (campo1, campo2, campo3 y campo4). En ellos se establece la misma fuente (opción font), el mismo borde (opción bd) y, sobre todo, un marco de color rojo de dos píxeles de grosor para indicar cuándo tienen el foco (opciones highlightcolor y highlightthickness):
Una vez creados los campos, se colocan verticalmente en la ventana principal con el método pack(). El espacio entre ellos se fija con las opciones padx
La siguiente sentencia establece el foco en el primer campo (campo1), para lo que se hace uso de uno de los métodos descritos en esta sección: focus_set():
Por último, se comienza el juego invocando la función modifica_foco(), en cuyo