Обновлять отображаемое значение каждый раз, когда обновляются ipywidgets - PullRequest
2 голосов
/ 12 апреля 2020

В моем блокноте 7 виджетов FloatSlider. Я хочу, чтобы продукт этих 7 виджетов постоянно отображался таким образом, чтобы при перемещении пользователем ползунков отображаемое значение обновлялось. В настоящее время я пытаюсь отобразить продукт SliderWidgets в Widgets.Text (n), но я не уверен, является ли это лучшим решением.

 import ipywidgets as widgets

caption = widgets.Label(value='Play around with the variables to see how N changes!')   

r = widgets.FloatSlider(value=1,
                         min=1.0,
                         max=3.0,
                         step=0.1,
                         description="R*")

fp = widgets.FloatSlider(value=1,
                         min=0.35,
                         max=1.0,
                         step=0.05,
                         description="fp")

ne = widgets.FloatSlider(value=1
                         min=0.2,
                         max=3.0,
                         step=0.1,
                         description="ne")

fl = widgets.FloatSlider(value=1,
                         min=1.0,
                         max=1.3,
                         step=0.05,
                         description="fl")

fi = widgets.FloatSlider(value=1,
                         min=0.5,
                         max=1.5,
                         step=0.05,
                         description="fi")

fc = widgets.FloatSlider(value=0.20,
                         min=0.10,
                         max=0.30,
                         step=0.05,
                         description="fi",)

l = widgets.FloatSlider(value=60000000.0,
                         min=5000000.0,
                         max=1000000000.0,
                         step=5000000,
                         description="fi")


n = widgets.Text(
    value= str(int(r.value * fp.value * ne.value * fl.value * fi.value * fc.value * l.value)) + " civilizations" ,
    description='Estimated N:',
    disabled=True)

left_box = VBox([r, fp, ne,fl])
right_box = VBox([ fi,fc,l,n])
HBox([left_box, right_box])

Этот код, который я использовал, отображает виджеты, но не обновляет виджет автоматически. Каков наилучший для меня способ, при котором не требуется каждый раз печатать новое значение?

1 Ответ

2 голосов
/ 12 апреля 2020

Вы можете использовать observe и функцию обратного вызова при изменении значения для каждого ползунка

def on_value_change(change):
    n.value = str(int(r.value * fp.value * ne.value * fl.value * fi.value * fc.value * l.value)) + " civilizations" 

r.observe(on_value_change)
fp.observe(on_value_change)
# ...
...