Значения виджетов ipywidgets не меняются - PullRequest
1 голос
/ 01 июня 2019

Я пытаюсь получить выходные данные из моих виджетов ipywidgets в Блокнотах Microsoft Azure, работающих под управлением Блокнотов Jupyter в Python 3.6.Тем не менее, он не возвращает новые значения, когда я их получаю.Это также относится к обработчикам событий / взаимодействовать, никогда не вызываемым для других виджетов.

Я пытался ввести разные начальные значения, используя разные типы виджетов (Text, Textarea, Checkbox, Button, ToggleButton).Я попытался получить w.value, ipywidgets.interact, w.observe и w.on_click для кнопок.

Тест, который я сделал:

import time
import ipywidgets as widgets
from IPython.display import display

w = widgets.Text(disabled=False)
display(w)

while True:
    print(w.value)
    time.sleep(1)

Я ожидаю, что когда явведите что-то в поле Text, чтобы он выводил этот текст, но вместо этого он продолжает печатать то, с чего начал.Там нет ошибок.Таким образом, для приведенного выше примера, независимо от того, что я ввожу в результирующее текстовое поле, все, что печатается, это пустые строки.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Проблема в том, что связь между виджетами и ядром Python асинхронна и сбивает с толку.

time.sleep(...) в ячейке блокирует только интерпретатор Python и не позволяет реализации виджета Javascript отправлять измененное значение вядро Python (потому что ядро ​​Python заблокировано и ничего не делает).

Если вы создаете виджет, затем изменяете текстовую запись виджета и затем оцениваете w.value в следующей ячейке в интерактивном режиме вы увидите измененное значение.

enter image description here

См. дальнейшее обсуждение здесь (ищите "async"):

https://github.com/AaronWatters/jp_proxy_widget/blob/master/notebooks/Tutorial.ipynb

В общем, если вы хотите заставить интерпретатор Python видеть какое-то значение, отправленное из реализации виджета Javascript, сторона Javascript должна каким-то образом перезвонить интерпретатору Python, и интерпретатор Python не может быть заблокирован сном или каким-либо другим способом.другой такой механизм.

1 голос
/ 03 июня 2019

Этот код не работает должным образом на обычном сервере ноутбуков, поэтому, вероятно, не будет работать и в Azure.Я подозреваю, что вам нужен процесс потока для чтения из обновленного виджета.Попробуйте сделать это и посмотрите, печатаете ли вы что-нибудь в записных книжках Azure при изменении текстового поля.

    import time
    import ipywidgets as widgets
    from IPython.display import display

    w = widgets.Text(disabled=False)
    display(w)

    def print_text(widget):
        print(widget['new'])

    w.observe(print_text, names='value')
...