这是一个完整的代码示例,可重现该错误。我能够在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',...)]
答案 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))
的列中,这似乎也很容易做到。