如何在iPython 3小部件(例如IntSlider)中保持对齐而不是右对齐标签?我的最终目标是左对齐一组带标签的小部件。这需要左对齐标签,因为标签是每个小部件最左边的元素。
我已经阅读过讨论了 Aligning TextBox Widgets in IPython Notebooks,但(a)它侧重于为右对齐标签创造更多空间,(b)建议的解决方案似乎不会影响标签宽度。 (顺便说一句,我有兴趣找到可以重置最小标签宽度的单元格可执行代码。)
我也阅读了Change the size of the label in an IPython notebook widget中的讨论,但它似乎没有提供简单的解决方案。
感谢您的帮助。
看起来widget.interactive()与Jakob建议的解决方案不太匹配。例如:
from IPython.html import widgets
from IPython.display import display
def mySlider(text='', twidth=100, min=0, max=10, value=5):
c1 = widgets.HBox()
ints = widgets.IntSlider(min=min, max=max, value=value)
text = widgets.HTML(text, width=twidth)
c1.children = (text, ints)
return c1
s1 = mySlider('Test')
s2 = mySlider('TestTest')
s3 = mySlider('TestTestTest')
def process(a, b, c):
print([a, b, c])
widgets.interactive(
process,
a=s1.children[1].value,
b=s2.children[1].value,
c=s3.children[1].value
)
通过常规对齐产生滑块标签a,b,c。
答案 0 :(得分:3)
您可以简单地将IntSlider与Html小部件组合在一起,以创建自定义小部件,如
from IPython.html import widgets
from IPython.display import display
def mySlider(text='', twidth=100):
c1 = widgets.HBox()
ints = widgets.IntSlider()
text = widgets.HTML(text, width=twidth)
c1.children = (text, ints)
return c1
使用此方法,某些小部件可能看起来像
s1 = mySlider('Test')
s2 = mySlider('TestTest')
s3 = mySlider('TestTestTest')
display(s1,s2,s3)
要将这些自定义小部件与交互一起使用,必须添加一些属性和回调。 interact 方法需要widget.description
和widget.value
参数来设置交互式小部件。由于我们的容器窗口小部件没有这些参数,因此会手动添加它们。此外,有必要将container.value
与IntSlider.value
相关联。这一点通过简单的赋值实现,更重要的是通过on_trait_change
方法。
最后,交互方法在widget.on_trait_change
回调上调用过程函数,因此container.on_trait_change
方法被IntSlider.on_trait_change
调用替换。
更新的代码如下所示:
def mySlider2(text='', twidth=100, min=0, max=10, value=5):
c1 = widgets.HBox()
ints = widgets.IntSlider(min=min, max=max, value=value)
text = widgets.HTML(text, width=twidth)
c1.children = (text, ints)
c1.description = text
c1.value = ints.value
def update(name, value):
c1.value = value
ints.on_trait_change(update,'value')
c1.on_trait_change = ints.on_trait_change
return c1
s1a = mySlider2('Test')
s2a = mySlider2('TestTest')
s3a = mySlider2('TestTestTest')
widgets.interactive(
process,
a=s1a,
b=s2a,
c=s3a
)