ValueError: с боке - PullRequest
       10

ValueError: с боке

1 голос
/ 09 июля 2019

Вот полный пример кода, который повторно генерирует ошибку. Я мог сделать это в предыдущих версиях Bokeh, но после обновления этот код больше не позволяет мне добавлять div в GridBox.

from bokeh.models import Panel, Tabs
from bokeh.io import output_file, show
from bokeh.plotting import figure
from bokeh.io import curdoc
from bokeh.models.widgets import Div
from bokeh.layouts import gridplot


p1 = figure(plot_width=300, plot_height=300)
p1.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=20, color="navy", alpha=0.5)

p2 = figure(plot_width=300, plot_height=300)
p2.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=20, color="navy", alpha=0.5)

p3 = figure(plot_width=300, plot_height=300)
p3.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=20, color="navy", alpha=0.5)

p4 = figure(plot_width=300, plot_height=300)
p4.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=20, color="navy", alpha=0.5)

g1 = gridplot([p1, p2, p3, p4], ncols=2, plot_width=800, plot_height=600)

tab1 = Panel(child=g1, title="circle")

tabs = Tabs(tabs=[ tab1 ])

doc = curdoc()
doc.add_root(tabs)

my_div = Div(text="Please wait...")

doc._roots[0].tabs[0].child.children[1].children.append(my_div)

Это сообщение об ошибке, которое я получил,

ValueError: ожидается элемент Список (Либо (Tuple (Instance (LayoutDOM), Int, Int)), Tuple (Instance (LayoutDOM), Int, Int, Int, Int))), получил seq с недействительным элементы [Div (id = '2515', ...)]

1 Ответ

1 голос
/ 09 июля 2019

Сначала несколько заметок:

  • Пожалуйста, пожалуйста, пожалуйста всегда предоставляйте всю необходимую информацию. В этом случае ваш комментарий о сетке привел меня в заблуждение, чтобы рассмотреть только API gridplot. Если бы вы включили номер строки / больше контекста из исключения, на ваш вопрос был бы дан ответ вчера.

  • Тебе определенно не следует шутить вокруг doc._roots. Он помечен как «частный» по какой-либо причине и может изменить имена или быть удаленным в любое время без предупреждения. (Это то, что означает личное, нет никаких гарантий ). У вас есть ссылка на созданный вами объект Tabs, вы должны обновить его напрямую.

Некоторое время назад произошел очень большой капитальный ремонт всей системы макетов. Многие, многие ошибки и проблемы были исправлены. У нас есть много тысяч тестов для поддержания совместимости версий, но это (очевидно) случайная поломка API. Для пользователей необычно гадить напрямую с GridPlot, поэтому его упустили. children для GridPlot теперь должно предоставлять явные координаты сетки, если вы посмотрите на содержимое GridPlot.children, вы увидите:

[(Figure(id='1852', ...), 0, 0),
 (Figure(id='1889', ...), 0, 1),
 (Figure(id='1926', ...), 1, 0),
 (Figure(id='1963', ...), 1, 1)]

Это список кортежей , которые включают явные позиции сетки.

Так что в вашем случае конкретно вы, вероятно, хотите:

tabs.tabs[0].child.children[1].children.append((my_div, 2, 0))

Однако я также хотел бы отметить, что вы также можете добавить div к столбцу, который содержит GridPlot, что также, кажется, было бы легче сделать.

...