Tomás Domínguez Mínguez

Desarrollo de interfaces gráficas en Python 3 con Tkinter


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

      Para resaltar el efecto de relieve en 3D, amplíe el grosor del borde de la etiqueta con la opción bd.

      El último atributo común que se va a estudiar es cursor. Con él, podrá modificar el icono que señala la posición del ratón dentro de la ventana principal. Tkinter tiene predefinidos los siguientes: "arrow", "circle", "clock", "cross", "dotbox", "exchange", "fleur", "heart", "man", "mouse", "pirate", "plus", "shuttle", "sizing", "spider", "spraycan", "star", "target", "tcross", "trek" y "watch".

      Para probar esta opción, añada la siguiente sentencia al programa anterior, después de la utilizada para asignar las dimensiones de la ventana principal con el método geometry(). Así, cuando mueva el ratón dentro de la ventana, el cursor tomará la forma de una araña:

illustration

      Vuelva a ejecutar el programa y sitúe el cursor dentro de la ventana. Compruebe cómo ahora su aspecto cambia para tomar la forma de ese temido animal:

illustration

      Unidad 5

       MÉTODOS COMUNES

      Al igual que sucede con las opciones, existen una serie de métodos compartidos por muchos controles gráficos. Estos se pueden agrupar en las siguientes categorías:

      •Asignación y obtención de valores de atributos. Compuesto por los métodos cget() y configure().

      •Temporizadores. Dentro de este grupo, estudiará los métodos after() y after_cancel().

      •Gestión del foco. Está formada por focus_get(), focus_set(), tk_focusFollowsMouse(), tk_focusNext() y tk_focusPrev().

      •Obtención de dimensiones y posiciones. Agrupa los métodos winfo_geometry(), winfo_x(), winfo_y(), winfo_width(), winfo_height(), winfo_rootx(), winfo_rooty(), winfo_ screenwidth(), winfo_screenheight(), winfo_pointerxy(), winfo_pointerx() y winfo_pointery().

      Además de los grupos anteriores, también existen los siguientes:

      •Gestión de eventos. Con los métodos bind(), bind_class() y bind_all(), se puede asociar un evento (o secuencia de eventos) a un widget concreto, a los pertenecientes a una misma clase o a todos los de una aplicación, respectivamente. Cuando se produzca dicho evento (o secuencia de eventos), se ejecutará la función designada como controlador. Por el contrario, los métodos unbind(), unbind_class() y unbind_all() realizarán la operación contraria, desvinculando eventos de widgets. Los estudiará posteriormente, en un capítulo dedicado exclusivamente a este tema.

      •Gestores de geometría. Este grupo lo componen los métodos grid(), pack() y place(), que ya conoce.

      •Gestión de portapapeles. Lo forman dos métodos relacionados con el contenido del portapapeles (utilizado en las operaciones copy&paste). Con clipboard_append(texto) se le añade un texto, mientras que con clipboard_clear() se vacía.

      •Eliminación de un widget. Al invocar el método destroy(), se provocaría la destrucción del widget. No lo confunda con los métodos pack_forget(), grid_forget() y place_forget(), que únicamente dejan de mostrarlo en pantalla.

      A continuación, se describe en detalle cada uno de los grupos de la primera lista.

      Dentro de esta categoría hay dos métodos. El primero se utiliza para obtener el valor de un atributo:

      cget("opción”)

      El segundo permite modificar el valor de una serie de opciones (atributos):

      configure(opción = valor, …)

illustration

      Este método es equivalente a config().

      Si se invocara únicamente con el nombre de una opción, devolvería su valor. Si se llamara sin argumentos, daría como resultado un diccionario con los valores de todas las opciones del widget. Para probarlo, añada la siguiente sentencia al final del último programa desarrollado en la práctica anterior, que mostraba una etiqueta centrada en la ventana con una imagen y un texto:

illustration

      Esta vez, además de abrirse la ventana de la aplicación, en la shell verá un diccionario con el valor de todas las opciones de la etiqueta. En la siguiente imagen puede comprobar que relief, text, bitmap y compound tienen el valor establecido en el constructor de widget:

illustration

      Otra forma de cambiar el valor de un atributo es mediante la expresión:

      widget["atributo"] = valor

      Por el mismo motivo, para asignar el valor de la opción de un widget a una variable, la expresión sería:

      variable = widget["atributo"]

      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.

illustration

      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:

illustration illustration

      Lo primero que se hace es importar