python-如何在ipywidgets交互式小部件(滑块)中对键名进行排序?
作者:互联网
我正在尝试在jupyter笔记本上使用ipywidgets创建交互式滑块,以在用户更改滑块Widget时更改绘图的数据,这很简单,我们可以轻松找到示例代码.我遇到的问题是双重的:1)当要显示的函数中有很多参数(=变量,滑块)时,滑块垂直排列,因此在不滚动jupyter页面的情况下很难控制它们.有什么方法可以像m by n grid那样排列滑块吗? 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
解决方法:
您将无法使用** kwargs解决此问题.如PEP468中所述
“它们(关键字参数)不起作用的唯一原因是解释程序将这些订购信息扔掉了.”
“从Python版本3.5开始,将保留关键字参数传递给函数的顺序”
因此,如果要获得这种行为,您应该:
使用“交互式”时命名您的参数:
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)
或者,据我所知,如果您真的想使用字典,则最好的方法是自己构建窗口小部件,而不使用“交互式”.
您可以这样进行:
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)
请享用 :-)
标签:jupyter-notebook,ipywidgets,python 来源: https://codeday.me/bug/20191118/2029198.html