Как в интерактивном режиме обновить ячейку уценки в блокноте jupyter с помощью виджета IPython?

Я использую ноутбук Jupyter с ядром Python 3. У меня есть вычисление, основанное на вводе пользователя с помощью виджета IPython. Результат вычисления необходимо отобразить в ячейке уценки. Для этого я использую nbextension Python Markdown. Теперь возникает вопрос: как мне обновить ячейку уценки при взаимодействии с пользователем?

Я попытался запустить ячейку уценки из Python с помощью вызова Javascript. В качестве минимального примера могут служить следующие две ячейки. (Первая нормальная ячейка Python, вторая ячейка уценки)

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


Обновление: как упоминалось в комментарии к ответу Сураджа Потнуру, моя основная проблема - это ошибка из здесь:

Большая проблема: что-то где-то должно возвращать Javascript в качестве вывода, иначе это не будет выполнено в записной книжке.

Но что еще хуже, возврата в связанной функции via 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)

не работает.

Как заставить вторую работать?


person jackattack    schedule 27.04.2019    source источник


Ответы (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() для обновления уценки внутри вашей ячейки с последним значением ползунка.

Вызывайте foo() функцию всякий раз, когда ваш слайдер обновляется, чтобы также обновить уценку.

person Suraj Potnuru    schedule 27.04.2019
comment
Спасибо, ваша идея - воздержаться от Python Markdown. Но это не то, что я ищу, и он не работает (кажется, что что-то не так с выбором ячейки, он корректно обновляет ячейку уценки, но также создает бесконечный цикл переоценки ячейки python. ). Я не хочу отказываться от Python Markdown. Большим преимуществом Python Markdown является то, что только переменная должна быть частью ячейки программы. Большой контент вокруг (который я пытался упомянуть с помощью ...) может быть тем, чем он является, просто форматированным текстом (внутри ячейки уценки). - person jackattack; 28.04.2019
comment
Я думаю, что моя основная проблема заключается в том, что здесь уже обсуждается: stackoverflow.com/questions/55773592/ Но его решение не работает для меня. Я обновлю свой вопрос-пост позже. - person jackattack; 28.04.2019