链接 ipython 小部件下拉列表和滑块值

Alf*_*Alf 1 python ipython-notebook jupyter-notebook ipywidgets

我“理解”如何将文本框链接到滑块(“理解”我的意思是如何使其工作):

from traitlets import link

a = widgets.FloatText(value=4.)
b = widgets.FloatSlider(min=3,max=7,step=0.23,value=4.)
display(a,b)

mylink = link((a, 'value'), (b, 'value'))
Run Code Online (Sandbox Code Playgroud)

这会导致如下结果:

链接小部件

但有什么办法,我怎么可以将一个下拉框,其值会list_items = ('case1', 'case2', 'case3')FloatSlider,对应的值是如(3.4, 5.4, 6.7)

小智 5

是的你可以。

使用 directional_link

link功能将两个相同类型的特征联系在一起。如果您需要对其中一个特征应用转换,您应该使用directional_link

from ipywidgets import Dropdown, FloatSlider
from traitlets import directional_link
from IPython.display import display

a= Dropdown(options=['case1', 'case2', 'case3'])
b= FloatSlider(min=3, max=7, step=0.23, value=4)

def transform(case):
    return {'case1': 3.4, 'case2': 5.4, 'case3': 6.7}[case]

directional_link((a, 'value'), (b, 'value'), transform)

display(a, b)
Run Code Online (Sandbox Code Playgroud)

请注意,这只会以一种方式进行,a --> b因此更新下拉列表会更新滑块,但不会反过来。如果您希望链接双向进行,则必须使用另一个directional_link

directional_link((b, 'value'), (a, 'value'), inverse_transform)
Run Code Online (Sandbox Code Playgroud)

使用 observe

observe是监听小部件特征变化的标准方法。如果您想触发更复杂的行为,而不仅仅是将两个特征联系起来,这就是要走的路。

在你的例子中:

def update_slider(change):
    b.value = {'case1': 3.4, 'case2': 5.4, 'case3': 6.7}[a.value]

a.observe(update_slider, names='value')
Run Code Online (Sandbox Code Playgroud)

再一次,这a --> b只是一种方式 ( )。观察变化b以使链接双向