Значения виджетов ipywidgets не меняются

Я пытаюсь получить выходные данные из моих виджетов 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 поле, что он будет выводить этот текст, но вместо этого он продолжает печатать то, с чего он начал. Там нет ошибок. Таким образом, для приведенного выше примера, независимо от того, что я ввожу в результирующее текстовое поле, все, что печатается, это пустые строки.

0 ответов

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

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

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

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

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

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

Этот код не работает должным образом на обычном сервере ноутбуков, поэтому, вероятно, не будет работать и в 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')
Другие вопросы по тегам