我有一个使用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上的主分支。关于这里的问题非常不知所措
由于
答案 0 :(得分:3)
您似乎没有将img
存储在任何位置,因此只要对export()
的调用返回就会收集它。
说明:
只要需要,Python中的对象就会保留在内存中。当Python确定不再需要某个对象时,它会删除该对象。
Python如何知道何时不再需要某个对象?通过计算参考。执行img = ImageExporter(...)
时,会创建一个带有一个引用的新对象:局部变量img
。
在函数内创建的变量被认为是该函数范围的本地变量。当函数退出时,变量img
消失,这导致ImageExporter
对象的引用计数降为0,这导致Python删除对象。
通过设置self.img = ImageExporter(...)
,您将指定对函数范围不的对象的引用(因为SimpleUI
对象被引用在函数返回后,self
继续存在)。只要SimpleUI
仍然保留引用,这就允许对象持久存在。