Контейнер как всплывающая подсказка не отображает содержимое

Я создаю диаграмму рассеяния и хочу показать некоторую информацию во всплывающей подсказке.

Следующее работает отлично:

import bqplot as bqp
import ipywidgets as ipw

xSc = bqp.LinearScale()
ySc = bqp.LinearScale()

tt = ipw.Label("A")
def hover_handler(self, content):
    tt.value = str(content)

s = bqp.Scatter(x=[0, 1, 2], y=[1, 2, 3], scales=dict(x=xSc, y=ySc),
                tooltip=tt)
s.on_hover(hover_handler)
bqp.Figure(marks=[s])

(нет топоров и еще чего-то, чтобы код был коротким)

При наведении курсора на каждую точку видно, что content просто отлично.

введите здесь описание изображения

Однако я не хочу просто показывать необработанный контент. Вместо этого я хочу показать его в табличной форме (но значения по умолчанию bqp.Tooltip недостаточно для моих нужд).

Однако, если я заключу ярлык в ipw.VBox, всплывающая подсказка станет крошечной вертикальной полосой. Добавление min_width и min_height увеличивает размер всплывающей подсказки, но там нет содержимого (хотя tt был создан со значением по умолчанию). Если я сделаю отдельный вызов для отображения только VBox, эта версия будет отображаться нормально (даже без определения макета) и даже обновляться при наведении указателя мыши на точки.

import bqplot as bqp
import ipywidgets as ipw
from IPython.display import display

xSc = bqp.LinearScale()
ySc = bqp.LinearScale()

tt = ipw.Label("A")
vb = ipw.VBox(children=[tt], layout=ipw.Layout(min_width='100px', min_height='100px'))
display(vb)
def hover_handler(self, content):
    tt.value = str(content)

s = bqp.Scatter(x=[0, 1, 2], y=[1, 2, 3], scales=dict(x=xSc, y=ySc),
                tooltip=vb)
s.on_hover(hover_handler)
bqp.Figure(marks=[s])

введите здесь описание изображения

Что мне нужно сделать, чтобы всплывающая подсказка отображалась правильно?


person Wasabi    schedule 18.06.2019    source источник


Ответы (1)


Я думаю, что для того, чего вы пытаетесь достичь, вам лучше использовать виджет Output в качестве всплывающей подсказки, а затем создать нужные виджеты и отобразить их, используя виджет вывода в качестве диспетчера контекста.

Если вы хотите увидеть, какая дополнительная информация может быть представлена, попробуйте распечатать content в своей hover_handler функции.

    import bqplot as bqp
    import ipywidgets as ipw
    from IPython.display import display, clear_output

    xSc = bqp.LinearScale()
    ySc = bqp.LinearScale()


    out = ipw.Output()

    def hover_handler(self, content):
        out.clear_output()
        with out:
            label = ipw.Label(content['data']['name'])
            display(label)

    s = bqp.Scatter(x=[0, 1, 2], y=[1, 2, 3], scales=dict(x=xSc, y=ySc),
                    tooltip=out)
    s.on_hover(hover_handler)
    bqp.Figure(marks=[s])

Для отображения таблицы информации вам, вероятно, понадобится виджет ipy.HTML, который можно использовать для передачи таблицы HTML. Я иногда использую для этого pandas с методом df.to_html ().

person ac24    schedule 20.06.2019
comment
Да, мой текущий обходной путь - это именно виджет ipy.HTML, который я жестко закодировал с помощью таблицы. Я не знал о df.to_html, проверю его и посмотрю, как выглядит всплывающая подсказка, если она заключена в ipw.Output (сегодня у меня нет доступа к коду). - person Wasabi; 20.06.2019
comment
К сожалению, это не работает. Я просто получаю пустую (но ненулевого размера) всплывающую подсказку, даже если я изменю метку на просто ipw.Label('A'). См. этот снимок экрана. - person Wasabi; 21.06.2019
comment
С какой версией ipywidgets и bqplot вы работаете? - person ac24; 21.06.2019
comment
ipywidgets 7.3.2 и bqplot 0.11.4 - person Wasabi; 21.06.2019
comment
Я использую ipywidgets 7.4.2 и bqplot 0.11.4. Я использую браузер Chrome, не уверен, что это имеет значение. - person ac24; 24.06.2019