#jupyter #ipywidgets
#jupyter #ipywidgets
Вопрос:
У меня есть некоторый код, который принимает входные данные из серии виджетов, а затем выполняет некоторые вычисления в фрейме данных pandas и печатает выходные данные. На данный момент вычисления запускаются при каждом изменении любого из виджетов. Учитывая, что вычисления занимают немного времени, я бы хотел отложить вычисления до тех пор, пока не нажму виджет кнопки отправки. Я не совсем понимаю, как привязать кнопку отправки к функции, которая затем также считывает другие виджеты.
Это упрощенная версия того, что у меня есть:
import ipywidgets as widgets
# input widgets that should only change the calcs after hitting the submit function
value_1 = widgets.BoundedFloatText(value=0.5, min=0, max=1, step=0.05)
value_2 = widgets.BoundedFloatText(value=0.5, min=0, max=1, step=0.05)
# submit button
submit_button = widgets.Button(description='submit')
# submit function
def submit():
# I don't know what to put here to restrict the triggering of the recalculate function until
# submit button is pressed
pass
# recalculate function
def recalculate(value_1, value_2):
# code to perform some calcs on a dataframe based on the widget inputs and print the result
# tie submit button to a function
submit_button.on_click(submit)
# code that ties the input calculations to the calculations
out = widgets.interactive_output(recalculate, {'value_1': value_1, 'value_2': value_2})
# display widgets
widgets.VBox([value_1, value_2, submit_button, out]
Ответ №1:
Два варианта.
Используйте interact_manual
(https://ipywidgets.readthedocs.io/en/latest/examples/Using Interact.html#interact_manual):
import ipywidgets as widgets
# input widgets that should only change the calcs after hitting the submit function
value_1 = widgets.BoundedFloatText(value=0.5, min=0, max=1, step=0.05)
value_2 = widgets.BoundedFloatText(value=0.5, min=0, max=1, step=0.05)
# submit function
def submit():
# I don't know what to put here to restrict the triggering of the recalculate function until
# submit button is pressed
pass
# recalculate function
def recalculate(value_1, value_2):
return value_1 value_2
# code to perform some calcs on a dataframe based on the widget inputs and print the result
# tie submit button to a function
submit_button.on_click(submit)
# code that ties the input calculations to the calculations
out = widgets.interact_manual(recalculate, value_1= value_1, value_2= value_2)
Или создайте свой собственный выходной виджет и управляйте отображением
import ipywidgets as widgets
# input widgets that should only change the calcs after hitting the submit function
value_1 = widgets.BoundedFloatText(value=0.5, min=0, max=1, step=0.05)
value_2 = widgets.BoundedFloatText(value=0.5, min=0, max=1, step=0.05)
out = widgets.Output()
# submit button
submit_button = widgets.Button(description='submit')
# recalculate function
def recalculate(value_1, value_2):
return value_1.value value_2.value
# code to perform some calcs on a dataframe based on the widget inputs and print the result
# submit function
def submit(button):
# I don't know what to put here to restrict the triggering of the recalculate function until
# submit button is pressed
total = recalculate(value_1, value_2)
out.clear_output()
with out:
display(total)
# tie submit button to a function
submit_button.on_click(submit)
# code that ties the input calculations to the calculations
# out = widgets.interactive_output(recalculate, {'value_1': value_1, 'value_2': value_2})
# display widgets
widgets.VBox([value_1, value_2, submit_button, out])
Комментарии:
1. Я использовал второй вариант, работает отлично. Спасибо.