ipywidgets:更改小部件值后自动更新变量并运行代码

Gus*_*avo 3 ipython jupyter-notebook ipywidgets

我一直在尝试在更改 ipywidget 后自动更新变量并运行代码片段。

到目前为止,我找到的唯一部分解决方案是声明一个全局变量,类似于 github 上的示例(此处):

import ipywidgets as widgets
from IPython.display import display
x = 5
slider = widgets.IntSlider()
slider.value = x
def on_change(v):
   global x
   x = v['new'] 
slider.observe(on_change, names='value')
display(slider)
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要实现的是在更改小部件后自动更改 x 值,而不使用全局变量,并且还更改一些先前定义的变量。它会是这样的:

x = 5
y = []
slider = widgets.IntSlider()
slider.value = x
def on_change(v):
   x = v['new']
   y.append(x)
slider.observe(on_change, names='value')
display(slider)
Run Code Online (Sandbox Code Playgroud)

ac2*_*c24 6

实现此目的的一种方法是创建一个接受新小部件值的类,并执行派生计算。我已经做了一个简单的添加,但您可以附加到列表中。

import ipywidgets as widgets

class Updated:

    def __init__(self):
        self.widget_value = None
        self.derived_value = None

    def update(self, val_dict) -> None:
        self.widget_value = val_dict['new']
        self.derived_value = self.widget_value + 10

update_class = Updated()

x = 5
y = []
slider = widgets.IntSlider()
slider.value = x

def on_change(v):
    update_class.update(v)
slider.observe(on_change, names='value')
display(slider)
Run Code Online (Sandbox Code Playgroud)

然后,您可以在移动滑块时看到如何变化update_class.widget_valueupdate_class.derived_value