从PyQt4小部件中的API导出pyqtgraph失败/崩溃python

时间:2014-12-17 15:57:35

标签: python pyqt4 pyqtgraph

我有一个使用PyQt4和pyqtgraph构建的小应用程序。我想在调用导出器的几个按钮中使用pyqtgraph(而不是,或者除此之外,使用当用户右键单击绘图时弹出的上下文菜单)。

然而,到目前为止,我还没有能够让它发挥作用。

以下是该应用程序的简化版本:

from PyQt4 import QtCore, QtGui
import pyqtgraph as pg
import pyqtgraph.exporters
import numpy as np
import sys


class SimpleUI(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)

        self.resize(1500, 1000)
        self.plot_widget = pg.GraphicsLayoutWidget(self)
        self.layout = QtGui.QVBoxLayout(self)

        data = np.arange(10)
        self.plt = self.plot_widget.addPlot()
        self.plt.plot(data)

        self.export_btn = QtGui.QPushButton("Export")
        self.export_btn.clicked.connect(self.export)

        self.layout.addWidget(self.plot_widget)
        self.layout.addWidget(self.export_btn)

    def export(self):
        img = pg.exporters.ImageExporter(self.plt)
        img.export()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = SimpleUi()
    ex.show()
    sys.exit(app.exec_())

在这种情况下单击“导出”按钮会导致对话框快速弹出然后消失。

如果我改为

img.export(copy=True)

并尝试将剪贴板上的内容粘贴到某些内容(Paint,无论如何),python.exe崩溃。

奇怪的是,通过pyqtgraph默认情况下可用的上下文菜单导出工作正常。另外,只需在终端工作,我就可以使用与上面相同的精确代码行复制/保存plotItems。即:

import numpy as np
import pyqtgraph as pg
import pyqtgraph.exporters

plt = pg.plot(np.arange(10))
img = pg.exporters.ImageExporter(plt.plotItem)
img.export()

这对我来说意味着导出器工作正常,但是当我从pyqt4小部件中以我调用它们的方式调用它们时,会发生一些奇怪的交互。

我已经尝试了pyqtgraph 0.9.8以及github上的主分支。关于这里的问题非常不知所措

由于

1 个答案:

答案 0 :(得分:3)

您似乎没有将img存储在任何位置,因此只要对export()的调用返回就会收集它。

说明:

  1. 只要需要,Python中的对象就会保留在内存中。当Python确定不再需要某个对象时,它会删除该对象。

  2. Python如何知道何时不再需要某个对象?通过计算参考。执行img = ImageExporter(...)时,会创建一个带有一个引用的新对象:局部变量img

  3. 在函数内创建的变量被认为是该函数范围的本地变量。当函数退出时,变量img消失,这导致ImageExporter对象的引用计数降为0,这导致Python删除对象。

  4. 通过设置self.img = ImageExporter(...),您将指定对函数范围的对象的引用(因为SimpleUI对象被引用在函数返回后,self继续存在)。只要SimpleUI仍然保留引用,这就允许对象持久存在。