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

Python 如何对ipywidgets交互式小部件(滑块)中的键名进行排序?,python,jupyter-notebook,ipywidgets,Python,Jupyter Notebook,Ipywidgets,我尝试在jupyter笔记本上使用ipywidgets制作交互式滑块,以便在用户更改滑块小部件时更改绘图数据,这很简单,我们可以很容易地找到示例代码。我的问题有两个:1)当我的函数中有许多参数(=变量、滑块)要显示时,滑块是垂直排列的,因此不滚动jupyter页面就很难控制它们。是否有任何方法可以像我希望的那样排列滑块,比如m×n网格?2) 为了传递大量整型/浮点值滑块,我制作了一个字典来传递给interactive函数。在这里,键(=滑块/变量/参数)名称似乎以随机顺序显示。我试图在事先按关键

我尝试在jupyter笔记本上使用ipywidgets制作交互式滑块,以便在用户更改滑块小部件时更改绘图数据,这很简单,我们可以很容易地找到示例代码。我的问题有两个:1)当我的函数中有许多参数(=变量、滑块)要显示时,滑块是垂直排列的,因此不滚动jupyter页面就很难控制它们。是否有任何方法可以像我希望的那样排列滑块,比如m×n网格?2) 为了传递大量整型/浮点值滑块,我制作了一个字典来传递给interactive函数。在这里,键(=滑块/变量/参数)名称似乎以随机顺序显示。我试图在事先按关键字名称排序后传递字典,但它仍然无法解决问题

如果你能分享任何想法,我将不胜感激

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)

您将无法使用**kwargs解决此问题。如中所述 “它们[关键字参数]不起作用的唯一原因是解释器将排序信息扔掉。” “从3.5版开始,Python将保留传递给函数的关键字参数的顺序”

因此,如果你想获得这种行为,你应该: 使用“交互式”时命名参数:

从ipywidgets导入交互式
从IPython.display导入显示
将numpy作为np导入
def myfun(**kwargs):
返回np.sum(列表(kwargs.itervalues())
w=交互式(myfun,var1=1,var2=2,var3=3,var4=4)
显示器(w)
或者,如果你真的想使用dict,据我所知,最好是自己构建小部件,而不使用“交互式”。 您可以这样做:

从IPython.display导入显示,清除\u输出
从ipywidgets导入小部件
从集合导入订单
变量dict=OrderedDict([('var1',1),('var2',2),('var3',3),('var4',4)])
def myfct(更改、列表小部件):
清除输出()
打印np.sum([widget.value用于列表中的widget\u widgets])
列表_小部件=[]
#创建小部件
对于名称,var_dict.iteritems()中的值:
list_widgets.append(widgets.IntSlider(value=value,min=value-2,max=value+2,description=name))
#将小部件与函数链接
对于列表中的小部件,\u小部件:
观察(lambda更改:myfct(更改,列出小部件),name='value',type='change')
#将小部件分组到FlexBox中
w=widgets.VBox(children=list\u widgets)
#显示小部件
显示器(w)

享受:-)

考虑使用?我尝试了OrderedDict,但没有成功,可能是因为Python的函数调用语义使用常规无序字典传入关键字参数。选项1(“在使用<代码>交互式时命名参数”)在使用Python 3.5.2时不可靠,IPython 5.1.0和ipywidgets 5.2.2。重新启动jupyter笔记本的内核后,小部件的顺序似乎也会随机变化。