如何在iPython 3中保持对齐小部件标签?

时间:2015-05-22 14:06:42

标签: widget alignment label ipython-notebook

如何在iPython 3小部件(例如IntSlider)中保持对齐而不是右对齐标签?我的最终目标是左对齐一组带标签的小部件。这需要左对齐标签,因为标签是每个小部件最左边的元素。

我已经阅读过讨论了 Aligning TextBox Widgets in IPython Notebooks,但(a)它侧重于为右对齐标签创造更多空间,(b)建议的解决方案似乎不会影响标签宽度。 (顺便说一句,我有兴趣找到可以重置最小标签宽度的单元格可执行代码。)

我也阅读了Change the size of the label in an IPython notebook widget中的讨论,但它似乎没有提供简单的解决方案。

感谢您的帮助。

附录(2015-06-02):

看起来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。

1 个答案:

答案 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)

enter image description here

更新以使用交互

要将这些自定义小部件与交互一起使用,必须添加一些属性和回调。 interact 方法需要widget.descriptionwidget.value参数来设置交互式小部件。由于我们的容器窗口小部件没有这些参数,因此会手动添加它们。此外,有必要将container.valueIntSlider.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
)