如何在ipywidgets交互式小部件(滑块)中对键名进行排序?

时间:2016-06-03 19:27:02

标签: python jupyter-notebook ipywidgets

我正在尝试使用jupyter笔记本上的ipywidgets创建交互式滑块,以便在用户更改滑块Widget时更改绘图的数据,这很简单,我们可以轻松找到示例代码。我遇到的问题有两个:1)当我要显示的函数中有很多参数(=变量,滑块)时,滑块是垂直排列的,这样在不滚动jupyter页面的情况下很难控制它们。有没有办法像我希望的那样安排滑块? 2)为了传递大量的整数/浮点值滑块,我将一个字典传递给交互式函数。这里,键(=滑块/变量/参数)名称似乎以随机顺序显示。我事先按键名称排序后试图传递字典,但它仍然无法解决问题。

如果你能分享任何想法,我会很感激。

def myfun(**var_dict):
    v = [value for value in var_dict.values()]
    return np.sum(v)

var_dict = {'var1':1,'var2':2,'var3':3,'var4':4}
w = interactive(myfun,**var_dict)
display(w)

ipywidgets interactive sliders

1 个答案:

答案 0 :(得分:3)

你将无法使用** kwargs解决这个问题。正如PEP468中所述 “他们[关键字参数]不起作用的唯一原因是因为解释器抛出了订购信息。” “从版本3.5开始,Python将保留传递给函数的关键字参数的顺序”

因此,如果您想要获得此行为,您应该: 在使用“interactive”时命名您的参数:

from ipywidgets import interactive
from IPython.display import display
import numpy as np
def myfun(**kwargs):
    return np.sum(list(kwargs.itervalues()))
w=interactive(myfun,var1=1,var2=2,var3=3,var4=4)
display(w)

或者,如果你真的想使用dict,据我所知,最好是自己构建小部件,而不使用'interactive'。 你可以这样做:

from IPython.display import display,clear_output
from ipywidgets import widgets
from collections import OrderedDict
var_dict = OrderedDict([('var1',1),('var2',2),('var3',3),('var4',4)])

def myfct(change,list_widgets):
    clear_output()
    print np.sum([widget.value for widget in list_widgets])

list_widgets=[]

# create the widgets
for name,value in var_dict.iteritems():
    list_widgets.append(widgets.IntSlider(value=value,min=value-2,max=value+2,description=name))

# link the widgets with the function
for widget in list_widgets:
    widget.observe(lambda change:myfct(change,list_widgets),names='value',type='change')

# group the widgets into a FlexBox
w = widgets.VBox(children=list_widgets)

# display the widgets
display(w)

享受: - )