Читать книгу Desarrollo de interfaces gráficas en Python 3 con Tkinter - Tomás Domínguez Mínguez - Страница 27

Unidad 6 VARIABLES DE CONTROL

Оглавление

Las variables de control son un tipo especial de variables, que se asocian a ciertos widgets para almacenar valores de entrada o visualización de información. Un ejemplo del primer caso serían los datos introducidos por el usuario en un campo de entrada de texto. Dichos datos quedarían a disposición del programa cuando fueran necesarios. Otro ejemplo, en este caso de visualización de información, sería el texto mostrado por una etiqueta, que cambiaría al modificarse el valor de la variable de control que tuviera asociada.


En el caso de las etiquetas, otra forma de modificar el texto que contienen es asignando el nuevo texto a la opción text con el método configure(), tal como ha podido comprobar en una práctica anterior.

La forma de asociar una variable de control a un widget es mediante la opción textvariable.

Una variable de control es un objeto que puede almacenar un número (entero o de coma flotante), una cadena o un valor booleano. Dependiendo del tipo de datos que contenga, dicho objeto será de la clase IntVar, DoubleVar, StringVar o BooleanVar. Sus constructores son:



Para poder usar alguna de estas clases, primero deberá importarla. Además, solo podrán crearse variables de control (objetos de estas clases) después de la ventana principal. De lo contrario, obtendría el siguiente error:

AttributeError: ‘NoneType’ object has no attribute ‘_root’

Si quisiera asignar un valor a la variable de control en el momento de crearla, estos constructores pueden invocarse con la opción value.

Otra forma de asignar un valor a una variable de control, una vez creada, es invocando el método:

set(valor)

Para obtener el valor que contiene, el método al que tendría que llamar es:

get()

Por último, si lo que desea es saber cuándo es leída, escrita o borrada, Tkinter ofrece el método:

trace(suceso, función)

El suceso puede tomar los valores "r", "w" y "u", dependiendo de si está interesado en saber cuándo se lee, se escribe o se borra su contenido, respectivamente. El segundo argumento es la función que se invocaría al producirse dicho evento.

En la siguiente práctica va a utilizar una variable de control para modificar el texto de una etiqueta, lo cual provocará un efecto de desplazamiento hacia la derecha:


El código utilizado para ello es el siguiente:



En primer lugar, se importan las clases necesarias, que son las utilizadas para crear la ventana principal (Tk), la etiqueta (Label) y, en especial, la variable de control con el texto que se mostrará en cada momento, StringVar():


Luego, se declaran las variables de configuración necesarias para el funcionamiento del programa. La primera (texto) es el texto que se quiere mostrar. La segunda (intervalo) establece la velocidad a la que se desplazará; en este caso, un carácter cada 200 milisegundos:


La siguiente variable (texto_auxiliar) contiene un texto auxiliar, al que se han añadido a la derecha tantos espacios como número de caracteres tenga el texto que mostrar. Su necesidad la entenderá más adelante:


Saltando la declaración de la función que realizará el desplazamiento horizontal del texto, se encuentran las sentencias que crean la ventana principal (root) y establecen el nombre que se verá en la barra de título:


Luego, se crea la variable de control que contendrá la parte del texto que se muestra en cada momento (variable_control) para dar sensación de movimiento. Será un objeto de la clase StringVar porque su contenido será un texto:


A continuación, se crea la etiqueta. Ya conoce todas las opciones utilizadas, excepto textvariable, que será la que asocie la variable de control que se acaba de crear (variable_control) con la etiqueta. Cada vez que asigne un nuevo texto a dicha variable, la etiqueta lo mostrará en pantalla de forma automática. Por ese motivo, en el constructor no se ha utilizado la opción text. Además, es importante destacar que se hace coincidir el tamaño de la etiqueta (atributo width) con la longitud del texto que mostrar. Más adelante entenderá el motivo:


Una vez creada la etiqueta, se sitúa en la ventana principal con el método pack():


Solo queda llamar a la función que comenzará el desplazamiento del texto:


La última sentencia invoca el método mainloop() de la ventana principal. Aunque no se generen eventos de usuario, es necesario para el correcto funcionamiento del método after(), utilizado dentro de la función anterior para provocar el movimiento del texto:


Tras describir el flujo principal del programa, llegó el momento de estudiar la función avanza(), encargada de dotar de movimiento al texto de la etiqueta. Dicha función declara la variable texto_auxiliar como global, porque su valor será modificado en cada una de las ejecuciones de la función, que será compartida en todas ellas:


Las tres variables siguientes quitan el último carácter del texto auxiliar (texto_auxiliar) y lo insertan al principio. Como al iniciar el programa este se compuso añadiendo al texto del mensaje el mismo número de espacios en blanco que su tamaño, provocará un efecto de desplazamiento hacia la derecha. Eso es debido a que estos espacios en blanco se van colocando al principio, y van desplazando el texto en dicho sentido. Cuando ya no haya más caracteres en blanco, el mensaje volverá a aparecer por la izquierda, siguiendo el mismo movimiento:


La siguiente sentencia es la más importante desde el punto de vista de esta práctica, ya que asigna el texto auxiliar que se acaba de obtener a la variable de control asociada a la etiqueta con el método set(). Pero no se copiarán todos sus caracteres, sino únicamente los correspondientes al tamaño de la etiqueta, que coincide con el número de caracteres del texto original (atributo width):


Finalmente, se llama al método after(), para que este proceso se repita de forma regular, provocando así un desplazamiento continuo del texto:


Solo queda ejecutar el programa y comprobar que se produce el efecto deseado.

Desarrollo de interfaces gráficas en Python 3 con Tkinter

Подняться наверх