2010-06-01 3 views
5

J'essaie d'imprimer le contenu d'un canvas tkinter python. J'ai essayé d'utiliser la méthode postscript de canvas pour créer un fichier postscript, mais j'ai une page blanche. Je sais que c'est parce que j'ai des widgets incorporés, et ceux-ci ne sont pas rendus par la méthode postscript. Avant de réécrire mon programme pour créer une mise en page plus facile à imprimer, quelqu'un peut-il suggérer un moyen d'aborder ce problème? Tous les livres de programmation que j'ai lus abordent le problème de l'envoi de sortie à une imprimante avec un peu de main-ondulation, quelque chose du genre: "C'est un problème difficile qui dépend de l'interaction avec le système d'exploitation." J'ai également du mal à trouver des ressources à ce sujet en raison de toutes les pages liées à l'impression à l'écran. J'utilise Python 2.6 sous Ubuntu 9.04.Impression de la sortie python tkinter

Répondre

0

Eh bien, c'est un problème difficile qui dépend de l'interaction avec le système d'exploitation. (Désolé, n'a pas pu résister!)

La solution canvas-to-postscript ne fonctionne que pour les éléments dessinés sur la toile - elle ne gère pas les fenêtres incorporées. Il y a des bibliothèques qui peuvent convertir une toile en PDF, mais je n'ai aucune expérience avec elles et je ne sais pas si elles traitent des fenêtres incorporées ou non (je suppose que non).

Il existe pdflib, qui est une bibliothèque C commerciale qui peut être intégrée avec python et tcl (et ainsi, Tkinter). Je n'ai aucune expérience avec la bibliothèque, et je suppose qu'elle ne gère probablement pas non plus les fenêtres intégrées. Je pense que c'est plus primitif - vous donnant des commandes pour créer des pages, des en-têtes, des pieds de page, etc.

Ceci est définitivement un problème avec Tk; a toujours, probablement toujours, car il ne semble pas y avoir beaucoup de demande ou d'intérêt de la part de qui que ce soit pour résoudre le problème de manière multi-plateforme.

+0

Pour ce problème, je pense que je peux refaire le travail en dessinant directement sur une toile. Je le ferai soit comme une fonction spéciale juste pour l'impression, soit pour refaire la fonctionnalité de l'écran de la même manière. Pour référence future, existe-t-il un package gui (ie wxpython) plus adaptable à l'impression? Ou est-ce que les gens adoptent souvent cette approche, consistant à coder une version pour l'écran et à coder séparément pour l'impression? – Eric

+0

@Eric: Je sais que wxPython a un certain support pour l'impression, mais je ne l'ai jamais utilisé donc je ne sais pas à quel point il est robuste. Si l'impression est un deal-breaker, vous pouvez essayer d'installer wxPython et lancer la démo pour voir si elle fait ce dont vous avez besoin. –

0

Je pense que votre butting jusqu'à la limite de Tkinter. Si ce n'est pas le cas pour les widgets, une autre méthode consiste à dessiner la même image sur un objet de dessin d'image PIL car les deux ont des API similaires.

Une solution de contournement hacky serait de prendre une capture d'écran de la zone de fenêtre que vous voulez utiliser ImageGrab dans PIL.

wxPython est une alternative décente. Personnellement, je préfère Qt, il a certainement un excellent support d'imprimante. En outre, le cadre de la vue graphique est remarquable.

1

Il s'avère que vous devez mettre à jour le canevas avant d'exporter le post-scriptum. Comme si:

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() 

Merci à Rio here pour la solution.

+0

C'était exactement mon problème. Merci! –

Questions connexes