【问题标题】:Blank postscript files from plot绘图中的空白 postscript 文件
【发布时间】:2011-06-29 17:33:11
【问题描述】:

我在 wxmpl 面板中有一个 matplotlib 图形,我正在尝试将它打印到 Postscript 文件中。我能得到的最好的是一个空白文件——“空白”并不是指空的,而是一个带有标题和诸如此类的 .ps 文件,但显示为一个空白页。

要打印的代码是:

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)

我查看了 wxmpl 代码,发现从未调用过 OnPrintPage,因此我尝试通过 wxmpl.FigurePrintout.OnBeginDocument 添加对其的调用。然后OnPrintPage 到达这一行:

self.GetDC().DrawBitmap(image.ConvertToBitmap(), wM_Dx, hM_Dx, False)

并抛出错误:

wx._core.PyAssertionError
C++ assertion "wxAssertFailure" failed in ../src/generic/dcpsg.cpp(2238): invalid postscript dc

Google 将我带到this email string,因此我尝试将上面的行替换为:

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

这消除了错误——但毕竟它仍然像以前一样打印空白文件。

另一个注意事项,只需将绘图保存为 Postscript 就可以正常工作 - 它使用不同的后端(FigureCanvasWxAgg 而不是 RendererAgg - 所以问题可能出在 matplotlib 而不是 wxmpl/wxPython 中?)。但是,我还需要将其打印到实际打印机上,因此 .ps 文件的特殊情况并不是真正可行的解决方案。

运行 Linux
wxmpl 版本 1.2.9
wxPython 版本 2.6.4.0
matplotlib 0.84 版(是的,我知道它已经过时了,但这就是我现在必须使用的)

【问题讨论】:

  • 更新 - 我为 OnBeginDocument 输入了错误的函数签名,所以它没有被调用。我修复了这个问题,以便调用 OnPrintPage,并且它确实打印正确(尽管输出文件似乎太大了 - 但这是一个不同的问题)。然而,问题仍然存在,为什么 OnPrintPage 没有被正常调用。任何信息都会有所帮助!

标签: python wxpython matplotlib wxmpl


【解决方案1】:

问题在于 wxmpl 没有调用 HasPage —— 毕竟,上面的所有更改都无关紧要。在 FigurePrintout 类中添加此代码修复了不打印的问题:

def HasPage(self, page):
    return page <= 1

是的……两行。根据 wxPython 打印框架的文档,默认值为 return page == 1,但 wxmpl 在其覆盖 GetPageInfo 时返回 0 作为第一页。所以打印机认为它没有要打印的页面。

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2022-01-03
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多