Когда свойство виджета доступно для ячейки iPython / Jupyter? - PullRequest
0 голосов
/ 25 октября 2019

Я готовлюсь создать виджет связи для использования в приложении Jupyter. Я пытаюсь понять, когда можно получить доступ к свойству «значение» виджета ... похоже, что «значение» можно прочитать в любое время, но не будет соответствовать «значение» модели виджета до тех пор, пока выполнение ячейки не остановится (т. Е. Состояние браузера виджета не обновляется до состояния ядра виджета).

Чтобы проверить это, я попытался создать небольшой виджет-слайдер, подождать 10 секунд, а затем прочитать свойство виджета "значение" ... все в одной клетке. За 10 секунд пользователь (то есть я) успевает изменить ползунок на что-то вроде «5».

Вот небольшой тест, который можно запустить в ячейке. Когда происходит сон (), я перемещаю ползунок к значению «5».

from ipywidgets import *
import time

slider = IntSlider(
    value=7,
    min=1,
    max=10.0,
    step=1,
    description="Input:",
)

display(slider)
time.sleep(10) # move slider to 5
print("done " + str(slider.value))

Я ожидал «сделано 5», но получил «сделано 7», подразумевая, что «значение» обновляется только послеячейка завершается.

Всегда ли это так? И есть ли способ принудительно выполнить синхронизацию между состоянием браузера виджета и его состоянием в ядре?

(I do получить ожидаемое "выполнено 5", если я переместу print () вследующая ячейка.)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Как оказалось, действительно , похоже, библиотека, которая использует что-то вроде asyncio для достижения встроенного ожидания. Он называется jupyter-ui-poll на https://github.com/Kirill888/jupyter-ui-poll. Автор говорит, что он доступен на PyPI на https://pypi.org/project/jupyter-ui-poll/

Очень многообещающе! ... в противном случае я вынужден согласиться с вами.

0 голосов
/ 30 октября 2019

В настоящее время практически нет способа автоматически заставить код, выполняющийся в ячейке, ожидать события или изменения в виджете. Такие вещи, как time.sleep(3), только замораживают ячейку, а созданный в той же ячейке ползунок не будет отображаться до тех пор, пока не будет завершен сон.

Пользователь может создать ползунок в ячейке 1, а затем выполнить сон в ячейке 2. и затем отрегулируйте ползунок, и код в ячейке 2 может увидеть изменения после сна, но в этом случае синхронизация направляется пользователем, а не автоматически.

Вы также можете запустить код Python из события виджета, но код Python не «запускается в ячейке», и «отпечатки» не попадают в стандартную область вывода ячейки, но вывод может быть получен другими способами.

На следующем снимке экрана я используювиджет «Вывод» для захвата вывода из события виджета

enter image description here

Основная проблема заключается в том, что вся связь между виджетами и ядрами происходит через односторонние сообщения- нет никаких «возвращаемых значений» или «подтверждений» любого вида.

Пожалуйста, см. https://github.com/AaronWatters/jp_proxy_widget/blob/master/notebooks/Tutorial.ipynb для дальнейшего обсуждения.

...