Siguiendo con la aplicación empezada en el capítulo anterior, ya se ha visto cómo generar ventanas de forma que puedan crearse y cambiarse de tamaño . Ahora se va a entrar a trabajar con el contenido de éstas .

Como ya se indicó, la primera operación consiste en dibujar iconos en la pantalla, aunque se irá ampliando . La operativa que se le va a dar al programa es la siguiente: cuando el usuario seleccione la opción de menú Icono, el siguiente clic dentro de la ventana dibujará una imagen predefinida en la posición marcada . Para dibujar otro habrá que volver a elegir la opción de menú y hacer clic sobre la ventana, y así sucesivamente .

Crear el icono

Las malas noticias son que las librerías de Python no saben manejar los recursos que los manuales de programación de Macintosh denominan iconos . Se trata de imágenes de tamaño fijo, 32 por 32 píxeles, que emplean una paleta de 256 colores y que tienen una serie de funciones en el sistema operativo para recuperarlos de disco, dibujarlos, etc . Las buenas noticias son que sí existen funciones para realizar las mismas operaciones con recursos ‘PICT’, que son simplemente imágenes guardadas con el formato pict de Apple y almacenadas como recursos en lugar de archivos de datos . Esto permite crear no sólo imágenes de 32 por 32 píxeles, sino cualquier tipo de imagen .

Para crear el dibujo que va a utilizar la aplicación es necesario acudir al programa ResEdit . Como recordará, tiene que crear un archivo con el mismo nombre que el programa pero terminado en “ . rsrc” en lugar de “ . py”, por tanto en este caso abra ResEdit y, en la misma carpeta donde se encuentra el documento “miprograma . py”, cree un nuevo archivo “miprograma . rsrc” . Esto le mostrará una ventana vacía en la que irá apareciendo una lista de los recursos que defina para este programa . De momento sólo se necesita un recurso ‘PICT’ que, como se ha indicado, es el que almacena la imagen, aunque posteriormente pueden irse añadiendo otros según lo requiera el programa; por ejemplo los de tipo ‘DLOG’ para mostrar y utilizar diálogos .

La operación para crear un recurso PICT es muy sencilla . Una vez creado el nuevo archivo con ResEdit y con la ventana en blanco, abra cualquier editor de imágenes o copie una ya existente, cambie a ResEdit y elija la opción Paste ( Pegar ) del menú Edit . Automáticamente el sistema le creará un recurso PICT con la imagen y el siguiente número libre empezando por 128 y contando hacia arriba . Guarde el resultado y ya tendrá su imagen lista para ser utilizada desde el programa .

Lo primero que debe hacerse en éste es incluir la librería que maneja los recursos . Por tanto al principio del programa, junto con los demás import incluya:

import Res

Aunque usted sepa que el archivo existe, un buen programador debe incluir en sus programas las instrucciones necesarias para preveer incluso los fallos no previsibles . En este caso, en la inicialización del objeto MiPrograma, es decir en la función __init__, hay que incluir la comprobación de que existe el archivo justo después de llamar a la función __init__ de Application . Como se vio en el capítulo dos esto se consigue con:

try:

dummy=Res . GetResource ( 'PICT', 128 )

except Res . Error:

try:

Res . OpenResFile ( “miprograma . rsrc " )

except Res . Error:

EasyDialogs . Message ( " No se pueden abrir los recursos " )

sys . exit ( 1 )

Como recordará, las construcciones “try” y “except” permiten ejecutar una operación y, si se produce un error, en lugar de hacer que el programa se pare, permitir que sea el propio programa el que lo detecte e intente corregirlo . La instrucción que aparece después del try es la que se intenta ejecutar . Si se hace con éxito, el programa sigue su curso normal y no se ejecutan las que vienen dentro de except . En cambio, si se produce un error y este es del tipo indicado en la instrucción except o de cualquier otro en el caso de que no se haya especificado, inmediatamente a continuación el ordenador pasa el control a las que vienen dentro del except . En este caso se indica Res . Error, es decir un error que se produce al intentar manejar un recurso .

La instrucción que hay dentro del primer try, Res . GetResource, es decir la función GetResource de la librería Res, intenta leer el recurso PICT con el número 128 para usarlo en el programa . Por omisión, cuando se ejecuta un programa, siempre se abre el propio programa con la librería de recursos y si emplea la utilidad BuildApplet, será en el archivo de su aplicación donde se encuentre almacenado el dibujo . En este caso el resultado de esta lectura se almacena en una variable de nombre “dummy” ( tonto, inútil ) , ya que realmente la lectura no se hace para utilizar la imagen, solamente para averiguar si puede leerse . Si está probando el programa arrojando miprograma . py encima del icono de python, los recursos no están incluidos en dicho documento, por lo que se producirá un error de recursos y el control pasará al except . Dentro de este se encuentra un segundo bloque try . . . except . Dentro del try se llama a la función OpenResFile de la librería Res . Esta función muestra la segunda forma que hay para acceder a un recurso . Se trata de abrir expresamente un archivo de forma que a partir de ese momento los recursos de este documento estén disponibles para ser usados por la aplicación de la misma forma que los incluidos en el propio programa, por ejemplo con la función GetResource . De esta forma puede abrirse el documento miprograma . rsrc y leer sus recursos .

Si aún así se produce una excepción, es que no existe este archivo ni tampoco, ya que se ha comprobado antes, está en el propio programa . En esta situación, la única posibilidad es dar un error y terminar la ejecución .

Manejar la ventana

Una vez hecho el trabajo previo hay que centrarse en el dibujado del icono dentro de la ventana . Una opción posible sería imbuir todas las operaciones del programa dentro de la propia clase MiPrograma, pero esto no resulta conveniente . La tecnología de objetos en la que se basa Python y muchos otros lenguajes está diseñada precisamente para encapsular todas las funciones de un objeto en éste, de forma que sea fácilmente transportable y reutilizable . Imagine, por ejemplo, que posteriormente desea añadir otra ventana en la que se dibujan líneas en lugar de imágenes . Si la función de dibujar líneas estuviera incorporada en el objeto aplicación, debería modificar este para que comprobara sobre qué tipo de ventana se ha hecho clic y realizará la acción consecuente . Si, en cambio, la “inteligencia” se ha imbuido en el propio objeto de ventana, el programa únicamente se encargará de pasarle al objeto que maneja cada uno la información de que se ha hecho clic en el contenido y el propio objeto sabrá lo que tiene que hacer . Evidentemente tendrá que tener dos objetos de manejo de ventanas, uno que dibuje imágenes y otro líneas; pero de la misma forma y con modificaciones mínimas al programa podrá crear múltiples ventanas con contenidos distintos .

En primer lugar conviene examinar la especificación del programa . Cuando se selecciona la opción Icono del menú correspondiente y, a continuación, se hace clic en la ventana, se dibujará el símbolo . Pero si se hace clic una segunda vez sin elegir nuevamente Icono, no tiene que hacer nada . Esto obliga a que tiene que recordarse si se ha elegido Icono y no se ha dibujado . Para ello se utilizará una variable de tipo booleana o bandera . Son variables que contienen un valor que puede ser verdadero o falso . Si es verdadero es que se ha elegido Icono y hay que dibujarlo, si es falso no hay que hacer nada .

Python no tie