0

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

我尝试使用 Javascript 调用从 python 运行降价单元格。作为一个最小的例子,以下两个单元可以服务。(第一个普通 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 的回答的评论中提到的那样,我的基本问题是来自这里的问题:

一个大问题:某处需要返回 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)

不起作用。

我如何让第二个工作?

4

1 回答 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 代码单元格,第一个单元格是您的降价单元格。

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

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

于 2019-04-27T12:26:24.033 回答