如何通过IPython小部件以交互方式更新jupyter笔记本中的markdown单元格?

问题描述 投票:0回答:1

我正在使用Jupyter笔记本和Python 3内核。我有一个基于IPython小部件的用户输入的计算。计算结果需要在降价单元格中显示。为此我使用Python Markdown nbextension。问题现在是:如何更新用户交互的降价单元?

我尝试使用Javascript调用从python运行markdown单元格。作为最小的例子,可以使用以下两个单元。 (第一个普通蟒蛇细胞,第二个降低细胞)

from IPython.display import Javascript
import ipywidgets

def update_md_cell(slider_value):
    Javascript("Jupyter.notebook.execute_cells([1])")

t_slider = ipywidgets.IntSlider(min = 0, max = 10,  value = 10)
ipywidgets.interactive(update_md_cell, slider_value = t_slider)
... The value of number is {{t_slider.value}}. ...

但这似乎只在功能之外起作用。

Javascript("Jupyter.notebook.execute_cells ([1])")

重新加载降价单元格。

def update_md_cell():
    Javascript("Jupyter.notebook.execute_cells ([1])")
update_md_cell()

什么也没做。

是否有另一种方法将输入(通过IPython小部件)连接到输出(在Markdown单元格中)?


更新:如对Suraj Potnuru的回答所述,我的基本问题是来自here的问题:

一个大问题:某些地方需要返回Javascript作为其输出,否则它不会在笔记本中执行。

但更糟糕的是,通过ipywidgets.interactive()绑定函数的返回不足以修复陷阱,例如:

def update_md_cell():
    return Javascript("Jupyter.notebook.execute_cells ([1])")
update_md_cell()

作品。

from IPython.core.display import Javascript
from IPython.display import display
import ipywidgets

def update_md_cell(slider_value):
    return Javascript("Jupyter.notebook.execute_cells ([1])")

t_slider = ipywidgets.IntSlider(min = 0, max = 10,  value = 10)
ipywidgets.interactive(update_md_cell, slider_value = t_slider)

不起作用。

如何让第二个工作?

python-3.x jupyter-notebook interactive ipywidgets python-markdown
1个回答
1
投票

将您的foo()函数更新为以下代码

def foo():
    slider_value = t_slider.value 
    display(Javascript("var markdown_cell = IPython.notebook.get_cell(1);markdown_cell.set_text('The value of the number is "+ str(slider_value) +"');IPython.notebook.execute_cell(1)"))

上面的代码片段获取了滑块对​​象的值,并使用get_cell()函数来获取作为降价单元格的第一个单元格。单元格编号从0开始,因此第0个单元格是您的python代码单元格,第1个单元格是您的降级单元格。

它使用set_text()函数使用最新的滑块值更新单元格内的markdown。

每当滑块更新时调用foo()函数也可以更新降价。

© www.soinside.com 2019 - 2024. All rights reserved.