2014-01-31 4 views
7

그래서 저는 며칠 동안 IPython 노트북을 가지고 놀았습니다. 하지만 이제 약간 멋진 것을해야합니다 :IPython Notebook : 프로그래밍 방식으로 JavaScript에서 셀을 트리거

나는 마커 다운 셀을 가지고 있습니다. 여기에는 HTML 입력과 버튼, 그리고 입력 내용을 가져 와서 파이썬 커널에 삽입하는 버튼에 첨부 된 JavaScript가 있습니다. 셀은 다음과 같습니다.

<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> 

매력처럼 작동합니다. 다음으로 나는 파이썬 코드 셀을 가지고있다. 몇 가지 ROOT 작업을 수행하고 위의 셀에서 파이썬 커널에 주입 된 값을 기반으로 플롯을 만듭니다. 여기에 파이썬 셀이 있습니다 :

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 변수를 승격 한 후, 위의 마크 다운 셀에서 해당 버튼을 클릭하면이 파이썬 셀이 자동으로 실행됩니다. 사과와 사전에 감사드립니다 - 이것은 나를위한 파이썬 2 일뿐입니다. 그래서 아마 정말 간단 할 것입니다.

답변

8

해결 방법 : 다른 셀을 직접 트리거하는 대신 다른 셀에 정의 된 파이썬 함수를 호출하고 이후에 콜백을 사용하여 JavaScript와 파이썬 커널간에 왕복을 수행 할 수 있습니다. 모두 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에서 물건을 할 수있는 콜백을 사용하는 어떤 다른 정의 파이썬 기능 testfunc (셀)가 반환됩니다.

이 솔루션의 뼈대는 최대 http://jakevdp.github.io/blog/2013/06/01/ipython-notebook-javascript-python-communication/입니다.

관련 문제