Ha llegado el momento de conocer el contenido de esta función. En primer lugar, se declara la variable estado, cuyos valores indicarán si el juego está en curso (“EN CURSO”), o si se ha finalizado con éxito (“OK”) o con fracaso (“KO”). Cuando se invoca la función es porque, de momento, está en curso; de ahí que se asigne inicialmente dicho estado:
Después, se obtiene el valor del campo actual (el pasado como argumento), utilizando el método get():
Las siguientes sentencias determinan si el juego ha terminado (podrá ser con éxito o con fracaso). Para ello, si los caracteres que hay escritos en dicho campo (texto_campo_actual) no coincidieran con los del texto de referencia (texto), el juego pasaría a un estado “KO” (más tarde se verá lo que se hace en este estado). En caso contrario, se comprobaría si el contenido de todos los campos coincide con el texto completo de referencia, en cuyo caso el juego pasaría a un estado “OK” (a continuación, descubrirá qué se hace en este otro estado):
Si el juego no hubiera terminado (no se ha cumplido ninguna de las condiciones de los if anteriores), su estado seguiría siendo en “EN CURSO”, por lo que se cumpliría la condición del siguiente if, en el que se decide el campo al que tendría que pasar el foco. Para saber cuál es, se usa la función randint(), que devuelve aleatoriamente el número 0 o el 1 (equivalente a False y True). En función de dicho valor, se invocaría a la función tk_focusNext() o tk_focusPrev() para identificar el campo siguiente o el anterior al que tiene el foco actualmente. Una vez conocido dicho campo (nuevo_campo), se le asigna el foco con el método focus_set(). Por último, se invoca de nuevo a esta función con el método after() para continuar jugando:
Si el juego ha finalizado (el estado no es “en curso”), se ejecutan las sentencias del bloque else. Dentro, hay otra sentencia if…else que determina si el juego ha finalizado con éxito (estado “OK”) o no. Si lo hubiera hecho con éxito, se crearía la etiqueta que muestra el mensaje de felicitación. La fuente del texto sería la misma de los campos de entrada (opción font), pero de color verde (opción fg). En caso contrario, la etiqueta tendría otro texto menos afortunado, con la misma fuente pero en color rojo. En ambos casos, se deshabilitan todos los campos de texto utilizando el método configure(), con el que se asigna el valor "disabled" al atributo. Por último, se llama al método pack(), para presentar en pantalla la etiqueta con el mensaje correspondiente de finalización del juego:
El atributo state, compartido por muchos widgets, determina el estado del widget en el que se encuentra. Se describirá más adelante, cuando estudie cada uno de ellos.
Seguro que estará deseando empezar a jugar. Espero que tenga mejor suerte que yo.
Si quiere mejorar la jugabilidad del programa, y también su dificultad, obligue a introducir algún carácter al cambiar el foco de campo.
5.4 MANEJO DE DIMENSIONES Y POSICIONES
En este apartado, se estudian todos los métodos relacionados con la obtención de las dimensiones de un widget, la ventana principal e, incluso, la pantalla. También conocerá los métodos necesarios para saber la posición de un widget en la ventana principal (o widget contenedor), así como la de la ventana o el ratón en la pantalla.
El primero que veremos devuelve las dimensiones y la posición de un widget en la ventana principal (o widget contenedor). Si, en vez de un widget, se tratara de la propia ventana principal, la posición devuelta sería la que ocupa en la pantalla:
El valor devuelto es una cadena con el siguiente formato:
anchoxalto±x±y
Los valores +x determinan la distancia entre el lado izquierdo del widget y el de la ventana, en píxeles. Si el signo fuera negativo, sería la distancia entre el lado derecho del widget y el de la ventana. Los valores +y indican la distancia entre el límite superior de la ventana y el del widget. Si el signo fuera negativo, sería la distancia entre el límite inferior de la ventana y el del widget; por ejemplo, un widget de 50 píxeles de ancho y 20 de alto, cuya esquina superior izquierda estuviera situada en la posición (200, 100), se describiría como:
Hasta que el gestor de geometría no asigne los tamaños y las posiciones correspondientes a todos los widgets que se muestran en la ventana principal, su valor inicial es "1x1+0+0". Para asegurarse de que el valor obtenido esté actualizado, invoque antes update_idletasks().
Métodos relacionados con el método anterior:
•winfo_rootx(). Devuelve la coordenada x del lado izquierdo de la ventana principal respecto de la pantalla del ordenador. Si tuviera un borde, haría referencia a su parte exterior.
•winfo_rooty(). Devuelve la coordenada y del lado superior de la ventana principal respecto de la pantalla del ordenador. Si tuviera un borde, haría referencia a su parte exterior.
•winfo_x(). Devuelve la coordenada x del lado izquierdo del widget respecto de la ventana principal (o widget contenedor). Si tuviera un borde, haría referencia a su parte exterior.
•winfo_y(). Devuelve la coordenada y del lado superior del widget respecto de la ventana principal (o widget contenedor). Si tuviera un borde, haría referencia a su parte exterior.
•winfo_width(). Devuelve el ancho del widget. Si el objeto sobre el que se invoca es de la clase Tk, corresponderá al ancho de la ventana principal.
•winfo_height(). Devuelve el alto del widget. Si el objeto sobre el que se invoca es de la clase Tk, corresponderá al alto de la ventana principal.
En caso de querer obtener el ancho y el alto establecido con las opciones width y height de un widget, deberá usar los métodos winfo_ reqwidth() y winfo_reqheight(), respectivamente. Como el gestor de geometría lo ajustará para encajarlo con el resto de los widgets que se muestran en la ventana principal (o widget contenedor), dichos valores no tienen por qué ser los mismos que los asignados a dichas opciones.
Si lo que desea conocer es el tamaño de la pantalla del ordenador, llame a los métodos:
•winfo_screenwidth(). Devuelve el ancho de la pantalla en píxeles.
•winfo_screenheight(). Devuelve el alto de la pantalla en píxeles.
El último grupo