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 страница 15

Desarrollo de interfaces gráficas en Python 3 con Tkinter - Tomás Domínguez Mínguez

Скачать книгу

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:

illustration illustration

      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:

illustration

      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:

illustration

      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:

illustration

      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:

illustration

      Por último, se llama a la función modifica_tamanio(), encargada de cambiar el tamaño del texto (su fuente) de forma continuada:

illustration

      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:

illustration

      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:

illustration

      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:

illustration

      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:

illustration

      El resultado obtenido al ejecutar este programa puede verse reflejado en la siguiente secuencia de imágenes:

illustration

      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.

illustration

      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:

illustration illustration illustration

      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:

illustration

      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

Скачать книгу