Значения виджетов 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')