Hasta ahora se ha visto el manejo de los principales elementos de la interfaz del Macintosh con Python y también se ha mostrado cómo manejar películas, imágenes y otros elementos . Sin embargo, no se ha visto el manejo de textos de gran tamaño, como en el caso de un tratamiento de textos o similar .

En este capítulo se verá cómo desarrollar las funciones básicas de manejo de textos, lo que permitirá crear ventanas en las que el usuario teclee caracteres de la misma forma que en un tratamiento de textos o bien integrar esta funcionalidad en otros programas más complejos .

La estructura del programa de ejemplo será similar a la que se ha estado utilizando hasta ahora; habrá un menú, y la opción Nuevo creará una nueva ventana en la que se podrán teclear textos .

Estructura del programa

La estructura del programa es muy similar a la que se explicó en el capítulo seis, por lo que para entender su funcionamiento puede ver la información proporcionada en dicho capítulo y en este caso se eliminan todas las referencias al dibujado de iconos .

Si desea copiar los dos archivos que componían aquel programa ( miprograma . py y ventana . py ) puede hacerlo y, a continuación y antes de empezar a introducir las instrucciones que se explican a continuación, elimine de miprograma . py las referencias a los recursos en __init__, ya que en este caso no es necesario manejar recursos propios del programa . Elimine en makeusermenus el menú contenido y la opción Icono y elimine la función iconoseleccionado, ya que se ha borrado la opción de menú que la llamaba .

En ventana . py hay que borrar la función “iconoseleccionado” y eliminar todas las líneas de dibujado de iconos en “do_update y do_contentclick”, así como todas las referencias a bandera y lista, de forma que quede como sigue:

from FrameWork import *

import Win

import Qd

class Ventana ( ScrolledWindow ) :

def open ( self,nombre= " Sin titulo " ) :

tamano = windowbounds ( 400,400 )

self . wid = Win . NewWindow ( tamano,nombre,1,0,-1,1,0 )

self . wid . DrawGrowIcon ( )

self . do_postopen ( )

def do_update ( self,wid,evento ) :

Qd . EraseRect ( self . wid . GetWindowPort ( ) . portRect )

self . wid . DrawGrowIcon ( )

def do_postresize ( self,ancho,alto,ventana ) :

Win . InvalRect ( self . wid . GetWindow¬ Port ( ) . portRect )

def do_contentclick ( self, local, modificadores,¬ evento ) :

pass

Este programa puede ejecutarse y permite crear una ventana, aunque el usuario no puede hacer nada en su contenido .

Librería de texto

Python incorpora las llamadas a una librería de proceso de textos incluida en el Mac OS conocida como TextEdit, y se maneja en este lenguaje bajo la abreviatura TE . Por tanto, lo primero que debe hacerse en ventana . py es incluir esta librería a continuación del resto de las librerías mediante la instrucción:

import TE

QuickDraw también proporciona funciones de dibujado de texto en ventanas de la misma forma que dibuja rayas, círculos e imágenes . Si se utilizaran estas funciones, el programador debería encargarse de un montón de tareas, desde determinar dónde está el margen derecho y hacer un salto de línea, hasta calcular a qué altura empieza la siguiente . Estos cálculos, y muchos más, los realiza automáticamente TextEdit, por lo que resulta más cómodo utilizarla . Sólo algunos programas de maquetación y dibujo no la emplean debido a que carece de algunas características de edición profesional; por ejemplo, el espacio variable entre letras en función de los caracteres . Si quiere aprender todas las características que soporta TextEdit, puede leer el capítulo TextEdit del libro “Inside Macintosh: Text” que se puede descargar de la web de desarrolladores de Apple y que también está disponible en otros formatos, como el CD de desarrolladores que distribuye la propia Apple .

Cada vez que se quiere crear una ventana de edición de textos, lo primero que hay que hacer es crear un objeto de edición de textos en su interior . Este objeto puede ser de dos tipos, monoestilo o multiestilo . Monoestilo es una ventana en la que todos los caracteres tienen el mismo tipo, tamaño y estilo y es el que emplean, por ejemplo, BBEdit y Alpha ( editores de programas en los que no es necesario cambiar el tipo de letra ) . En cambio, si lo que quiere es crear un documento al estilo de un tratamiento de textos debe generar un documento multiestilo, de forma que una palabra pueda estar en Times y la siguiente en Helvetica y negrita .

Antes de crear el objeto de edición hay que realizar un paso previo . Al igual que en el programa de dibujo de imágenes que se comentó en el capítulo 6 había que fijar previamente el puerto de dibujo a la ventana, en este caso también es necesario, y además debe realizarse antes de crear el objeto de edición de texto ya que este se “pega” al puerto activo en cada momento . Como ya se vió, la instrucción para activar el puerto de dibujo ( es decir, aquel en el que se ejecutarán las instrucciones de dibujo que se indiquen posteriormente ) es:

Qd . SetPort ( self . wid )

Siendo self . wid, como se recordará, el puntero a la ventana que se acaba de crear . Si no se da esta instrucción antes de crear el área de edición de textos, esta se asociará al área activa previamente, que es una ventana “virtual” asociada a toda la pantalla, y cuando se ejecute el programa y se tecleen caracteres, éstos aparecerán en la parte superior izquierda de la pantalla, en lugar de aparecer dentro de la ventana, borrando la barra de menús .

Para crear un área de edición monoestilo se emplea la función TENew de TextEdit, mientras que un área multiestilo emplea la función TEStyleNew . Esta será la que se use en este ejemplo . Ambas funciones devuelven un objeto de tipo TE y hay que proporcionarles como parámetros dos rectánculos: el área de destino y el área visible . El significado de ambas es sencillo si piensa en un documento de un tratamiento de textos al que se le reduce la ventana en anchura . Aunque la parte derecha de la página no sea visible, el texto debe escribirse hasta el margen derecho, que será como aparezca impreso . La zona de la ventana que el usuario ve es el área visible, mientras que la zona hasta la que se escribe el texto, incluso si está oculta, es el área de destino .

El determinar si ambas son iguales o no depende de cada tipo de programa; en este caso se supondrá que ambas son iguales al crear la ventana y que posteriormente si se cambia el tamaño de la ventana, se modificará el área visible pero no la de destino .

Para obtener el tamaño de la ventana se utiliza el campo portRect del WindowPort, una estructura que ya se ha empleado alguna otra vez y que contiene toda la información necesaria para que QuickDraw dibuje en la ventana . Como portRect es un rectángulo, los valores que devuelve hay que almacenarlos en cuatro variables:

sup,izdo,inf,dcho = self . wid . GetWindowPort ( ) . portRect

que son, respectivamente, la posición superior, la izquierda, la inferior y la derecha . Estos cuatro valores se asignan a dos nuevas variables, destino, visible, con:

destino = visible = sup,izdo,inf,dcho

De forma que se crean dos rectángulos con los mismos valores . Por último se llama a TEStyleNew pasándole estos dos valores:

self . ted = TE . TEStyleNew ( destino,visible )

Con esto la ventana queda lista para empezar a escribir en ella . Para implementar la funcionalidad mínima, es decir que al pulsar un caracter este se escriba dentr