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

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

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

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 в качестве вывода, иначе это не будет выполнено в записной книжке.

Но, что еще хуже, возврата в функцию с помощью функции ipywidgets.interactive () недостаточно для исправления ошибки, например ::1026

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)

не работает.

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

1 Ответ

1 голос
/ 27 апреля 2019

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

...