2010-06-01 26 views
5

Estoy intentando imprimir el contenido de un lienzo tkinter de python. He intentado usar el método postscript de lienzo para crear un archivo postscript, pero obtengo una página en blanco. Sé que esto se debe a que tengo widgets incrustados, y estos no se representan con el método PostScript.Imprimir la salida de Python tkinter

Antes de volver a escribir mi programa para crear un diseño más fácil de imprimir, ¿alguien puede sugerir una forma de abordar este problema? Todos los libros de programación que he leído abordan el problema de enviar resultados a una impresora con un movimiento manual, algo así como: "Es un problema difícil que depende de la interacción con el sistema operativo". También me resulta difícil encontrar recursos sobre esto debido a todas las páginas relacionadas con la impresión en la pantalla.

Estoy usando Python 2.6, en Ubuntu 9.04.

Respuesta

0

Bueno, es un problema difícil que depende de la interacción con el sistema operativo. (Lo siento, no pude resistir!)

La solución lienzo a postdata solo funciona para las cosas dibujadas en el lienzo, no maneja las ventanas integradas. Hay bibliotecas que pueden convertir un lienzo en PDF, pero no tengo experiencia con ellos y no sé si manejan ventanas integradas o no (supongo que no).

Hay pdflib, que es una biblioteca C comercial que se puede integrar con python y tcl (y por lo tanto, Tkinter). No tengo experiencia con la biblioteca, y supongo que probablemente tampoco maneje ventanas integradas. Creo que es más primitivo: le da comandos para crear páginas, encabezados, pies de página, etc.

Esto definitivamente es un problema con Tk; siempre lo ha hecho, probablemente siempre lo hará ya que no parece haber mucha demanda, o el interés de cualquiera para resolver el problema de forma cruzada.

+0

Para este problema, creo que puedo rehacer el trabajo dibujando directamente en un lienzo. Lo haré como una función especial solo para imprimir, o rehacer la funcionalidad de la pantalla de la misma manera. Para referencia futura, ¿hay un paquete de GUI (es decir, wxpython) que sea más adaptable a la impresión? ¿O las personas a menudo toman este enfoque, de codificar una versión para la pantalla y codificar por separado para imprimir? – Eric

+0

@Eric: Sé que wxPython tiene cierto soporte para la impresión, pero nunca lo he usado, así que no sé cuán robusto es. Si la impresión es un factor decisivo, puede intentar instalar wxPython y ejecutar la demostración para ver si hace lo que necesita. –

0

Creo que estás a tope hasta los límites de Tkinter. Si no fuera por los widgets, otro método es dibujar la misma imagen en un objeto de dibujo de imágenes PIL ya que ambos tienen API similares.

Una solución hacky sería tomar programáticamente una captura de pantalla del área de la ventana que desee utilizando ImageGrab en PIL.

wxPython es una alternativa decente. Personalmente prefiero Qt, sin duda tiene un excelente soporte de impresora. También el marco de Graphics View es sobresaliente.

1

Resulta que debe actualizar el lienzo antes de exportar la posdata. Como tal:

from Tkinter import * 

root = Tk() 
canvas = Canvas(bg='white', width = 200, height = 200) 
canvas.pack() 

canvas.create_line(0, 0, 199, 199, fill="blue", width = 5) 
canvas.create_line(0, 199, 199, 0, fill="blue", width = 5) 

canvas.update() 
canvas.postscript(file = "x.ps") 

root.mainloop() 

Gracias a Rio here por la solución.

+0

Este fue exactamente mi problema. ¡Gracias! –

Cuestiones relacionadas