El lector ha aprendido ha manejar en los capítulos anteriores un gran número de operaciones de Python y de las librerías del Mac OS . Sólo queda un elemento imprescindible en cualquier programa: imprimir . Si hace un tratamiento de textos, una base de datos o el mismo traductor que se mostró en el primer capítulo, su utilidad aumentará considerablemente cuando pueda imprimir el resultado .

Arquitectura de impresión

El Macintosh puede manejar un gran número de impresoras, desde modelos láser con PostScript hasta impresoras de chorro de tinta a color, pasando por modelos matriciales, filmadoras profesionales e incluso la aplicación Acrobat de Adobe que se comporta como una impresora y realmente genera documentos PDF que se pueden distribuir libremente respetando el diseño original .

Pero esta versatilidad, en contra de lo que pueda aparentar a primera vista, no supone un aumento de complejidad para el programador . Un programa no sabe realmente qué impresora tiene instalado el usuario ( es posible descubrirlo pero no es necesario ) ya que todas ellas se manejan de la misma forma por medio de instrucciones QuickDraw que es el lenguaje nativo que utiliza el Mac OS para dibujar y escribir . Imprimir resulta muy sencillo, basta con dar las mismas instrucciones que para dibujar en pantalla .

Como demostración, se va a utilizar el programa MiVentana creado en el capítulo anterior y se le va a añadir la opción de imprimir de forma que lo que se dibuja en pantalla también pueda imprimirse .

Modificar los menús

En primer lugar hay que añadir a la barra de menús los dos que son estándar en cualquier aplicación: “Ajustar página” e “Imprimir” . Para ello abra el documento miprograma . py y vaya a la función makeusermenus . Esa función define los menús Archivo y Contenido de su aplicación, debiendo modificarse el primero para añadir dos elementos .

Dado que las opciones de menú aparecen en estos según el orden en que se definan en el programa, las dos opciones comentadas más las líneas de separación entre las opciones anteriores y posteriores deben añadirse en el orden correcto, es decir después de la instrucción en la que se añade la opción “Cerrar” y antes de “Salir” . Añada una línea en blanco e inserte las líneas siguientes:

self . menuArchivo . addseparator ( )

self . itemAjustarPagina = MenuItem ( self . menuArchivo, " Ajustar

página… " , " " ,self . AjustaPagina )

self . itemImprimir = MenuItem ( self . menuArchivo,¬ " Imprimir… " , " P " ,self . Imprime )

self . menuArchivo . addseparator ( )

Con esto se definen las dos opciones de menú tal como se ha explicado en capítulos anteriores y se instruye al programa para que cuando el usuario seleccione “Ajustar Página” se llame automáticamente a la función “AjustaPagina” del objeto MiPrograma y la opción “Imprimir” llame a la función Imprime del mismo objeto .

Si quiere ejecutar el programa y comprobar cómo queda la interfaz de usuario debe definir estas funciones para evitar que Python dé un error al arrancar . Para ello se crean sin ningún contenido real, insertando simplemente la instrucción “pass”, que luego se sustituirá con las operaciones reales .

Como cada una de estas dos funciones es llamada desde el objeto Application, su definición debe llevar dos parámetros, el primero “self” que siempre es el primer parámetro de una función que pertenece a un objeto y que permite que pueda acceder a los campos de este, y el segundo “*args” son los parámetros que el Mac OS le pasa al programa cuando se selecciona la opción de menú . Por tanto la definición provisional de estas funciones queda como sigue:

def AjustaPagina ( self,*args ) :

pass

def Imprime ( self,*args ) :

pass

Ahora puede ejecutar el programa y comprobar su interfaz de usuario, aunque evidentemente estas recién creadas opciones del menú no harán nada de utilidad .

Código inicial

Para poder imprimir, en primer lugar debe incluir las librerías que le proporcionan al Sistema esta funcionalidad . La primera es “Qd”, que incluye la definición de todas las funciones y datos de QuickDraw, que como ya se ha dicho es utilizado por la librería de impresión . La segunda librería a incluir es, evidentemente, la encargada de manejar todo el proceso de impresión, que se denomina “Printing” . Por tanto, al principio del programa debe incluir las líneas que incluyen estas dos librerías a continuación de las importaciones ya existentes tal como sigue:

import Qd

import Printing

Todas las operaciones de impresión se realizan utilizando un objeto especial de tipo TPrintRecord que almacena toda la información de la impresora, opciones que elije el usuario y datos del documento a imprimir . Para crear este objeto, en la función de arranque de MiPrograma “__init__” se crea con la siguiente instrucción:

self . registroimpre = Printing . NewTPrintRecord ( )

Esta línea conviene añadirla al final de dicha función __init__, cuando se han inicializado los demás objetos y realizado las comprobaciones necesarias . El objeto creado se guarda a su vez en un objeto de la aplicación para que pueda emplearse posteriormente cuando se realice cualquier operación relacionada con la impresora .

En segundo lugar hay que abrir la impresora . Esto no significa que vaya a imprimir inmediatamente, eso se logra abriendo un documento de impresión como se muestra más adelante, pero carga el controlador de la impresora y permite que el programa pueda utilizarla posteriormente . Al colocar esta operación al principio del programa se evita tener que hacerlo posteriormente y si su programa puede imprimir desde varias ventanas no tiene que repetir la misma instrucción . Esta apertura de la impresora es muy sencilla:

Printing . PrOpen ( )

Un programa bien hecho, al igual que abre la impresora debe cerrarla cuando va a terminar . Esto se logra con una instrucción con el nombre, evidente, de “Printing . PrClose ( ) ” y debe colocarse justo antes de que termine el programa . El objeto Application incluye una función con este fin exclusivo, se llama cleanup y lo que hace tal como esta definida es cerrar todas las ventanas que pudieran estar abiertas, pero es posible crear una función cleanup dentro de MiPrograma que realice más operaciones . Esto se llama herencia en el lenguaje de programación orientada a objetos y quiere decir que si desde cualquier función, ya sea definida por usted o existente en Application, se llama al método cleanup, se llama siempre al del objeto más exterior ( en este caso MiPrograma ) y si no existe busca la función con el mismo nombre en el objeto empleado como base y así sucesivamente . La definición de cleanup será:

def cleanup ( self ) :

Application . cleanup ( self )

Printing . PrClose ( )

La segunda línea permite llamar a la función cleanup original de forma que siga realizando la función que tenía originalmente de cerrar todas las ventanas, ya que según la explicación dada anteriormente, si se vuelve a definir una función del objeto padre, Python llama a esta nueva y no a la del objeto padre a menos que se le diga expresamente como es este caso .

Observe que no se llama a esta función desde su programa, lo hace automáticamente Application cuando se ejecuta la orden Salir, de la misma forma que ejecuta las instrucciones de manejar menús, ventanas, etc .

Ajustar página

Normalmente la impresión en un programa está asociada a dos opciones de menú, una la de imprimir propiamente dicha y la otra es la de ajustar página, que muestra un diálogo que permite que el usuario defina el tamaño del p