Как принимать входные данные от многих виджетов, но пересчитывать только при нажатии кнопки отправки?

#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. Я использовал второй вариант, работает отлично. Спасибо.