Как выровнять метку виджета по левому краю в iPython 3?

Как я могу выровнять по левому краю, а не по правому краю, метку в виджете iPython 3, например IntSlider? Моя конечная цель - выровнять по левому краю набор помеченных виджетов. Это влечет за собой выравнивание их меток по левому краю, поскольку метка является крайним левым элементом каждого виджета.

Я прочитал обсуждение в Выравнивание виджетов TextBox в блокнотах IPython, но ( а) он направлен на освобождение места для этикетки, выровненной по правому краю, и (б) предлагаемое решение, похоже, не влияет на ширину этикетки. (В стороне, мне было бы интересно найти исполняемый код ячейки, который может сбросить минимальную ширину метки.)

Я также прочитал обсуждение в Измените размер метки в виджете записной книжки IPython, но, похоже, он не предлагает простого решения.

Спасибо за вашу помощь.

Приложение (02.06.2015):

Похоже, что widget.interactive () плохо сочетается с решением, предложенным Якобом. Пример:

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 с обычным выравниванием.


person Ronnen Levinson    schedule 22.05.2015    source источник


Ответы (1)


Вы можете просто объединить 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
)
person Jakob    schedule 27.05.2015
comment
Спасибо, @Jakob. См. Приложение выше. - person Ronnen Levinson; 03.06.2015