IPython Notebook:以编程方式从JavaScript触发单元格

时间:2014-01-31 00:44:35

标签: ipython-notebook

所以,我一直在玩IPython笔记本几天,我喜欢它!但是,现在我需要做一些有点花哨的事情:

我有一个降价单元;在其中,有一个HTML输入和按钮,以及一些附加到按钮的JavaScript,它将获取输入的内容,并将其注入到python内核中。这是细胞:

<h3>Use JS to pass DOM info to Python kernel: </h3>
<input id='testinput' value='FragmentId'></input>
<button id='testComms' onclick='JS2PY()'>:D</button>

<script type="text/javascript">    
    function JS2PY(){
        var input = document.getElementById('testinput').value,
            kernel = IPython.notebook.kernel;

        kernel.execute('testVar = "' + input + '"');
    }
</script>

像魅力一样!接下来我有一个python代码单元;它做了一些ROOT的东西,并根据从上面的单元格注入到python内核中的任何值来创建一个图。这是python单元格:

def testfunc():
    from ROOT import TH1, TFile, TTree
    import rootnotes, numpy

    c2 = rootnotes.canvas("treeData", (600,400))

    testfile = TFile("fragment27422_000.root")
    testtree = testfile.Get("FragmentTree")

    buff = numpy.zeros(1, dtype=float)

    testtree.Branch(testVar, buff)

    testtree.Draw(testVar)
    return c2

testfunc()

如果我手动去运行单元格也没问题 - 太棒了!但是我真正想要的是,在我推广testVar变量之后,当我点击上面的降价单元格中的那个按钮时,这个python单元格会自动运行。道歉并提前感谢 - 这对我来说只是python的第二天,所以它可能非常简单。

2 个答案:

答案 0 :(得分:10)

解决方案/解决方法:我们不是直接触发其他单元格,而是调用其他单元格中定义的python函数,然后在JavaScript和python内核之间进行往返,之后回调,全部通过IPython.notebook.kernel.execute;像这个代码单元格的东西:

%%HTML

<div id='testwrap'>
<input id='varname'></input>
<img id='imgtarget'></img>
<button id='fetchplot' onclick='exec_code()'>Plot</button>
</div>

<script type="text/Javascript">
    function handle_output(out_type, out){
        document.getElementById('imgtarget').src = 'data:image/png;base64,' + out.data['image/png'];
    }

    function exec_code(){
        var kernel = IPython.notebook.kernel;
        var callbacks = {'output' : handle_output};
        kernel.execute('testVar = "' + document.getElementById('varname').value + '"');
        kernel.execute('testfunc(testVar)', callbacks, {silent:false});
    }
</script>

第一个kernel.execute从DOM中将一些数据踢到内核,第二个使用回调在JS中执行任何python函数testfunc(在其他一些单元格中定义)回报。

对于此解决方案的骨骼来说,http://jakevdp.github.io/blog/2013/06/01/ipython-notebook-javascript-python-communication/大了!

答案 1 :(得分:0)

有趣的第一个笔记本项目(现在帖子有点老了)。现在,可以像这样使用 IPython.notebook.execute_cell(..)

%%HTML

<h3>Select an Experiment</h3>
<input id='input' value='my input var'></input>
<button id='testComms' onclick='JS2PY()'>:D</button>

<script type="text/javascript">    
    function JS2PY() {
        const { value } = document.getElementById('input');
        const pycode = `testVar = '${value}'`;
        const { notebook } = IPython;
        const { kernel } = notebook;
        kernel.execute(pycode);
        // run cell using `testVar`
        notebook.select_next();
        notebook.execute_cell();
    }
</script>

在上面的示例中,下一个笔记本单元格应包含您要执行的代码。