ValueError:具有散景

时间:2019-07-09 18:57:01

标签: python bokeh

这是一个完整的代码示例,可重现该错误。我能够在Bokeh的早期版本中执行此操作,但是升级此代码后,不再允许我向GridBox添加div。

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:应为的元素   列表(要么(元组(实例(布局DOM),整数,整数),   元组(Instance(LayoutDOM),Int,Int,Int,Int)))),seq无效   项目[Div(id ='2515',...)]

1 个答案:

答案 0 :(得分:1)

一些注意事项:

  • 请,请,请始终提供所有相关信息。在这种情况下,您对网格的评论使我误入歧途,只考虑使用gridplot API。如果您从例外中加入了行号/更多上下文,那么您的问题将在昨天得到解答。

  • 您绝对不应嘲笑doc._roots。由于某种原因,它被标记为“私有”,并且可能随时更改名称或将其删除,而不会发出警告。 (这就是私有的意思,没有保证。)您引用了您创建的Tabs对象,您应该直接对其进行更新。

不久前,整个布局系统都进行了大修,修订了1.1版。许多,许多错误和问题已得到修复。我们有成千上万的测试来维持版本兼容性,但这(显然)是偶然的API损坏。用户直接使用GridPlot进行处理是不寻常的,所以这就是为什么它被遗漏的原因。现在,children的{​​{1}}必须提供明确的网格坐标,如果您查看GridPlot的内容,则会看到:

GridPlot.children

其中是元组的列表,其中包含明确的网格位置。

因此,具体来说,您可能想要:

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

但是,我还要注意,您也可以将div附加到包含tabs.tabs[0].child.children[1].children.append((my_div, 2, 0)) 的列中,这似乎也很容易做到。