Jupyter忽略pyqtgraph类`_repr_png_`,但使用自己的类' _repr_png_

时间:2017-11-16 09:47:01

标签: python python-3.x jupyter-notebook pyqtgraph

困境:我正在扩展pyqtgraph以显示内联图。在核心,这应该意味着添加class PlotWindow(PlotWidget): … def _repr_png_(self): exp = ImageExporter(self.plotItem) qimg = exp.export(toBytes=True) qbytearray = Qt.QByteArray() buffer = Qt.QBuffer(qbytearray) buffer.open(Qt.QIODevice.ReadWrite) qimg.save(buffer, 'PNG') buffer.close() return bytes(buffer.data()) 方法就足够了:

%gui qt4

在实践中,当我尝试

import PyQt4
import pyqtgraph
pw = pyqtgraph.plot(range(100))
pw.show()
pw
_repr_png_

我希望Jupyter笔记本能够调用<pyqtgraph.graphicsWindows.PlotWindow at 0x7f5f43666708> 方法。相反,我得到了简单的

pw.show()

现在,如果我添加一个瘦包装器(在此之前调用class myclass(object): def __init__(self, pw): self._pw = pw def _repr_png_(self): return self._pw._repr_png_() myobj = myclass(pw) myobj ):

map

我得到了一个内嵌图,正如预期的那样。那么,我在这里做错了什么?为什么不使用这种方法?

1 个答案:

答案 0 :(得分:1)

问题在于PlotWidget.__getattr__()在被要求输入错误属性时错误地引发了NameError而不是AttributeError。这会导致在IPython.utils.dir2.get_real_method()内发生的一些额外检查,导致该方法被忽略。

如果您修改PlotWidget.__getattr__()来代替AttributeError,那么一切都会按预期进行。