在iPython笔记本中自动更新对象的SVG表示

时间:2014-02-12 07:38:37

标签: ipython ipython-notebook

我有一个包含SVG图像的对象(从ElementTree派生)。该对象具有方法_repr_svg_,因此可以在iPython笔记本中将其呈现为SVG图像。现在假设我在一个单元格中运行

In [n]: object
Out[n]: # drawing appears here

然后我修改了对象。是否可以让iPython自动重新评估单元格以便更新图形?

例如,是否有可能在每次成功评估笔记本中的任何其他单元格后重新评估特定单元格?

1 个答案:

答案 0 :(得分:2)

我不确定是否使用_repr_svg_,但您可以使用IPython 2.0(当前开发版本,可从github的Master分支获得)创建丰富的内容,该内容根据各种事件进行更新。

你可以在这里看到一个例子: http://nbviewer.ipython.org/github/ipython/ipython/blob/master/examples/widgets/Variable%20Inspector.ipynb

魔术在线上完成 self._ipython.register_post_execute(self._fill)

每当执行新单元格时调用“fill”函数。在您的情况下,“_ fill”函数应绘制SVG而不是更新HTML表。

简单示例(仅适用于IPython 2.0)。这会根据变量r

的值绘制一个sVG圆
ipython = get_ipython()
from IPython.html import widgets

###del ipython._post_execute[make_svg]  ##add it if you rerun the cell. 
r = 50
def make_svg():
    svg_code = """<svg width="300" height="200">
    <circle cx="50" cy="50" r="%d" stroke="black" stroke-width="3" fill="red" />
</svg>
""" % r
    _modal_body_label.value = "<br>%s<br>" % svg_code 
ipython.register_post_execute(make_svg)


_modal_body_label = widgets.HTMLWidget(value = 'Not hooked')


_modal_body_label