Использование Ipython ipywidget для создания переменной?

Это кажется очень простым, но я не смог найти ни одного примера или решить это сам. Как использовать виджет ipywidget для создания или возврата переменной / объекта Python, таких как список или строка, которые можно использовать в следующей ячейке?

3 ответа

Решение

Хорошее введение в ipywidgets можно найти по адресу http://blog.dominodatalab.com/interactive-dashboards-in-jupyter/ где можно найти ответы на этот вопрос.

Вам нужны два виджета, один для ввода, а другой для привязки значения этого ввода. Вот пример для ввода текста:

from ipywidgets import widgets  

# Create text widget for output
output_variable = widgets.Text()

# Create text widget for input
input_text = widgets.Text()

# Define function to bind value of the input to the output variable 
def bind_input_to_output(sender):
    output_text.value = input_text.value

# Tell the text input widget to call bind_input_to_output() on submit
input_text.on_submit(bind_input_to_output)

# Display input text box widget for input
input_text

# Display output text box widget (will populate when value submitted in input)
output_text

# Display text value of string in output_text variable
output_text.value

# Define new string variable with value of output_text, do something to it
uppercase_string = output_text.value.upper()
print uppercase_string

Затем вы можете использовать строку uppercase_string или output_text.value, например, во всей записной книжке.

Аналогичный шаблон можно использовать для использования других входных значений, например, ползунка взаимодействия ():

from ipywidgets import widgets, interact

# Create text widget for output
output_slider_variable = widgets.Text()

# Define function to bind value of the input to the output variable 
def f(x):
    output_slider_variable.value = str(x)

# Create input slider with default value = 10    
interact(f, x=10)

# Display output variable in text box
output_slider_variable

# Create and output new int variable with value of slider
new_variable = int(output_slider_variable.value)
print new_variable

# Do something with new variable, e.g. cube
new_variable_cubed = pow(new_variable, 3)
print new_variable_cubed

Снимок экрана записной книжки iPython для иллюстрации переменных связывания из ipywidgets Text () и взаимодействовать () для использования во всей записной книжке

Другое решение, которое может быть проще, это использовать interactive, Это действует как interact, но позволяет получить доступ к возвращенному значению в более поздних ячейках при создании только одного виджета.

Простой пример ниже, а более полная документация здесь

from ipywidgets import interactive
from IPython.display import display

# Define any function
def f(a, b):
    return a + b

# Create sliders using interactive
my_result = interactive(f, a=(1,5), b=(6,10))

# You can also view this in a notebook without using display.
display(my_result)

Теперь вы можете получить доступ к значению результата, а также к значениям виджетов, если хотите.

my_result.result  # current value of returned object (in this case a+b)
my_result.children[0].value # current value of a
my_result.children[1].value # current value of b

Это добавление к ответу Эльза на комментарии Томаса Николса. Смотрите мой комментарий здесь . Этот блок кода объединяет то, что я предлагаю, основываясь на ответе Эльза:

      from ipywidgets import interactive
from IPython.display import display

# Define any function
def f(a, b):
    global the_current_value
    the_current_value = a + b
    display(the_current_value)
    return a + b

# Create sliders using interactive
my_result = interactive(f, a=(1,5), b=(6,10))

# You can also view this in a notebook without using display.
display(my_result)

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



Asyncio может быть подходящим вариантом, если его невозможно использовать.

Как я уже указывал внизу , это решение вопроса « Можно ли получить текущее значение ползунка виджета из функции без использования многопоточности?»может представлять интерес для тех, кто ищет доступ к текущим значениям. В этом примере использование asyncio позволяет получать обновленную информацию от виджета, который выбирает значение, позволяя при этом использоватьtime.sleep()который, кажется, блокируетinteractive()от работы.

Другие вопросы по тегам