J'ai une figure matplotlib à l'intérieur d'un panneau wxmpl, et j'essaie de l'imprimer dans un fichier Postscript. Le mieux que je peux obtenir est un fichier vide - par 'vide' je ne veux pas dire vide, mais plutôt un fichier .ps avec des en-têtes et autres joyeusetés mais affiche comme une page vierge.Fichiers postscript vierges de l'intrigue
Le code à imprimer est:
printer = self.GetPrinter() # wxmpl.FigurePrinter
fig = self.get_figure() # matplotlib.figure.Figure
printData = wx.PrintData(printer.getPrintData())
printer.printFigure(fig, "Plot")
self.printer.setPrintData(printData) # reset print data (avoid segfaults)
J'ai regardé dans le code wxmpl et a constaté que OnPrintPage
est jamais appelé, donc j'ai essayé d'ajouter un appel à ce via wxmpl.FigurePrintout.OnBeginDocument
. Alors OnPrintPage
arrive à cette ligne:
self.GetDC().DrawBitmap(image.ConvertToBitmap(), wM_Dx, hM_Dx, False)
et renvoie une erreur:
wx._core.PyAssertionError
C++ assertion "wxAssertFailure" failed in ../src/generic/dcpsg.cpp(2238): invalid postscript dc
Google m'a conduit à this email string, et par conséquent j'essayé de remplacer la ligne ci-dessus:
dc = self.GetDC()
dc.StartDoc("printing stuff")
dc.StartPage()
dc.BeginDrawing()
dc.DrawBitmap(image.ConvertToBitmap(), wM_Dx, hM_Dx, False)
dc.EndDrawing()
dc.EndPage()
dc.EndDoc()
Cela a permis de se débarrasser de l'erreur - mais après tout, c'est toujours en train d'imprimer des fichiers vierges comme avant. Une autre remarque, simplement sauvegarder le tracé comme Postscript fonctionne bien - il utilise un backend différent (FigureCanvasWxAgg au lieu de RendererAgg - donc peut-être que le problème est dans matplotlib au lieu de wxmpl/wxPython?). Cependant, j'ai besoin d'imprimer cela sur une imprimante réelle, donc le boîtier spécial pour les fichiers .ps n'est pas vraiment une solution viable.
Exécution Linux
Version 1.2.9 wxmpl
wxPython Version 2.6.4.0
version matplotlib 0,84 (oui, je sais que c'est horriblement pas à jour, mais c'est ce que je dois travailler avec pour l'instant)
Mise à jour - J'avais mis la mauvaise signature de fonction pour OnBeginDocument, donc il n'était pas appelé. J'ai corrigé cela afin que OnPrintPage ait été appelé, et il a imprimé correctement (bien que les fichiers de sortie semblent beaucoup trop grands - mais c'est un problème différent). La question reste cependant de savoir pourquoi OnPrintPage n'est pas appelé normalement, cependant. Toute info serait utile! – whrrgarbl