En el capítulo pasado se vio cómo crear una aplicación que permitiera crear documentos de edición de textos, ya sean de forma independiente, como en el caso de un tratamiento de textos, o bien para integrar estas funciones en otras aplicaciones con funcionalidades añadidas .

La aplicaión que se creó dista de estar completa . Además de carecer de las operaciones de grabar y recuperar documentos de disco, también están ausentes los menús, y las operaciones asociadas a ellos, de tamaño, estilo y tipo de letra . En este capítulo se verá cómo implementar dichas funciones, lo que permitirá obtener una aplicación completamente funcional .

Acceder al texto

Examinando las funciones estudiadas en el capítulo anterior, se observa que el texto es almacenado directamente por un objeto al que el programa no accede . Por una parte esto es mejor, ya que le ahorra al programador el tener que manipular directamente dicho texto, pero por otra parte parece representar una dificultad, ya que existen operaciones en las que es necesario acceder a este texto . Y esto no sólo ocurre si se quiere guardar y recuperar el texto, también es necesario por ejemplo, si se incluye una función de buscar como tienen la mayoría de los tratamientos de textos .

Afortunadamente, el objeto TE incorpora funciones que permiten tanto recuperar el texto como insertarlo para el caso en el que se quiere recuperar un documento de disco .

La recuperación del texto introducido para guardarlo en disco o buscar en él se realiza a través de la función GetText . Esta función devuelve una estructura y uno de los campos de esta estructura, denominado “data” es precisamente el texto introducido en el objeto .

Por tanto, las dos líneas de programa que le dan acceso al texto son:

datos = self . ted . TEGetText ( )

texto = datos . data

Después de ejecutarlas, en “texto” se tiene una matriz de caracteres que corresponde al texto introducido por el usuario .

La operación contraria, es decir introducir un texto en el documento, por ejemplo si se ha leído de un archivo en disco, se denomina, TESetText y como parámetro hay que pasarle una matriz con los caracteres leídos .

Guardar en disco

La primera función que debe incorporarse en el programa es la de Guardar el texto a disco . Una característica de TEGetText es que devuelve el texto puro y por tanto los datos que se almacenan en disco son los que se conocen como “archivos ASCII” que permiten que dicho documento sea abierto e interpretado por cualquier tratamiento de textos .

Como contrapartida está el hecho de que al almacenarse de esta forma se pierde toda la información de formato ( tamaños, estilos, tipos de letra ) que, como se verá posteriormente, se haya introducido . Más adelante se mostrará cómo poder recuperar y guardar esta información también .

Para diferenciar ambos casos, a la opción de guardar el texto puro se la denominará en el menú “Guardar ASCII . . . ” y posteriormente se añadirá la opción “Guardar . . . ” convencional que permitirá almacenar estilos .

Para la primera, lo primero que debe hacerse es añadir esta nueva opción de menú en el archivo miprograma . py en la función makeusermenus . La línea que realiza esta operación es:

self . itemGuardar = MenuItem ( self . menu¬

Archivo, " Guardar ASCII… " , " S " ,self . Guarda¬ VentanaASCII )

Siguiendo los estándares de Apple, esta opción se inserta en el menú Archivo y conviene añadirla después de la opción Cerrar . Tal como se define en ella . A continuación hay que definir en este mismo objeto una función GuardaVentanaASCII .

En primer lugar, esta función debe mostrar el diálogo de guardar archivo y si el usuario introduce un nombre y pulsa el botón OK, llamará a una función guardaASCII del objeto Ventana .

La forma de mostrar el diálogo de Guardar ya se vio en el capítulo primero, utilizando la librería macfs y la función StandardPutFile de dicha función . Recordará que esta función devuelve dos parámetros: el primero es el nombre y situación del archivo . El segundo es uno si el usuario ha pulsado el botón Guardar y cero si pulsa Cancelar . Por tanto, si devuelve uno, y sólo en este caso, hay que llamar a guardaASCII pasándole el nombre y situación recibidos de los usuarios . La función quedará como sigue:

def GuardaVentanaASCII ( self,*args ) :

nombre,ok = macfs . StandardPutFile¬

( 'Nombre del archivo:' )

if ok:

self . ventana . guardaASCII¬ ( nombre . as_pathname ( ) )

Dentro del objeto Ventana, la función guardaASCII debe extraer el texto del documento, como ya se ha explicado y guardarlo en disco . Las líneas que se encargan de esto son:

def guardaASCII ( self,nombre ) :

datos = self . ted . TEGetText ( )

texto = datos . data

archivo = open ( nombre,'wb' )

archivo . write ( texto )

archivo . close ( )

Además de self, esta función recibe el nombre y situación en la que debe guardarse el archivo y después de extraer el texto tal como se ha explicado al principio de este capítulo, se abre dicho archivo con la función open y como segundo parámetro de esta función se pasan los caracteres ‘wb’ . ‘w’ significa que se abre para escritura, es decir si no existe se crea y si ya existe, se borra su contenido . El segundo parámetro ‘b’ indica que se tiene que abrir en binario . Normalmente cuando se abre un archivo se realizan conversiones de caracteres, especialmente los que indican el salto de línea, para adaptarlos entre diversos sistema operativos, pero dado que el objeto TE ya almacena el texto en el formato correcto, no es necesario hacer esta conversión, para lo que se utiliza la opción ‘b’ .

A continuación se escribe todo el texto con la función write, que escribe en el archivo todos los datos que se le pasan y por último se cierra el documento .

Si inserta estas funciones en el programa del capítulo anterior, verá que ya puede crear documentos de texto que luego puede abrir con otro tratamiento de textos .

Leer datos del disco

El procedimiento para abrir un documento tiene una sencillez similar, ya que debe crear una ventana de la misma forma que hizo con la opción nuevo y, al final, hay que abrir el archivo, leer el texto e insertarlo en el documento .

Para seleccionar el archivo de texto se utilizará la función complementaria de StandardPutFile en la librería macfs: PromptGetFile, que también se vio en el capítulo uno . Además del mensaje que aparece en el diálogo, esta función necesita un segundo parámetro, el tipo de archivo que se quiere abrir . Los documentos de texto ASCII, y los que se crean con Python si no se le da otro tipo específico, se graban con el tipo ‘TEXT’ y este es el que se debe usar .

El procedimiento es similar al de guardar documento . En primer lugar se crea la opción de menú de “Abrir ASCII”, que llamará a la función AbreVentanaASCII de MiPrograma . Esta función es muy similar a GuardaVentanaASCII, pide el archivo a abrir con PromptGetFile, si devuelve “OK” se crea un nuevo objeto Ventana y se pasa la información del archivo a la función abreASCII de dicho objeto Ventana .

En realidad la función abreASCII es muy similar a la función open del objeto Ventana, la única diferencia entre ambas sería que en este caso hay que abrir el archivo de texto e insertar su contenido en el documento . En realidad puede optimizarse el programa para que la función open realice las dos operaciones . Simplemente es necesario que cada vez que se la llame se le pase un primer parámetro que si es cero indica que no hay que abrir el archivo ( c