散景中的OpenURL - 在同一个标​​签中打开

时间:2016-10-29 04:26:00

标签: javascript python html bokeh

考虑下面the Bokeh Docs中的示例,有没有办法调整TapTool,以便当我点击一个圆圈时,我会被带到相同标签上的网址而不是打开一个新标签?文档字符串表明唯一的行为是打开一个新标签,但也许有一个CustomJS解决方法或其他一些黑客来解决这个问题?

from bokeh.models import ColumnDataSource, OpenURL, TapTool
from bokeh.plotting import figure, output_file, show

output_file("openurl.html")

p = figure(plot_width=400, plot_height=400,
       tools="tap", title="Click the Dots")

source = ColumnDataSource(data=dict(
    x=[1, 2, 3, 4, 5],
    y=[2, 5, 8, 2, 7],
    color=["navy", "orange", "olive", "firebrick", "gold"]
    ))

p.circle('x', 'y', color='color', size=20, source=source)

url = "http://www.colors.commutercreative.com/@color/"
taptool = p.select(type=TapTool)
taptool.callback = OpenURL(url=url)

show(p)

我包装了一些javascript而没有成功(从this question借用,但对于如何实现它却毫无头绪)。这导致没有链接打开:

callback = CustomJS(args=dict(source=source), code="""          
        url = data['url']
        window.open(url,"_self");
    """)    

taptool = p.select(type=TapTool)
taptool.callback = callback

我还尝试使用<a>关键字将tag标记视为OpenURL。这是盲目的尝试,因为我找不到任何关于如何正确使用这个tag术语的内容。这里没有运气。

url = "http://www.colors.commutercreative.com/@color/"
taptool = p.select(type=TapTool)
taptool.callback = OpenURL(url=url, tags=["_self"])

我理解Bokeh仍然很新,所以也许这个功能还没有。如果你知道足够的javascript(我显然没有),我仍然认为有一个解决方法。

1 个答案:

答案 0 :(得分:2)

tags是一个尘土飞扬的功能,它们与此无关。它们只是允许您将一些任意信息附加到Bokeh Model,如果您在以后查找该特定模型时查询对象图形,这可能会有所帮助。

从Bokeh 0.12.3开始,OpenURL不支持此功能,只需调用window.open

https://github.com/bokeh/bokeh/blob/master/bokehjs/src/coffee/models/callbacks/open_url.coffee#L18

name window.open参数添加新属性只需要几行代码。我建议在issue tracker上打开功能请求问题。如果您有兴趣使用PR来实现此功能,我们将很乐意帮助新贡献者入门。

这也可以通过CustomJS回调来完成。如果你只想在点击一个圆圈时打开一个固定的URL,就像

callback = CustomJS(args=dict(source=source), code="""          
    window.open("http://foo.com" ,"_self");
    """)    

如果您的数据源中有一个列具有完整的网址,并且您希望根据所选索引选择一个列,则需要执行更类似OpenURL回调功能的操作:关闭所选索引数据源,然后使用选定的索引从然后调用window.open中获取数据源中列的URL。这是一个完整的例子:

来自bokeh.plotting导入图,output_file,show     来自bokeh.models导入CustomJS,ColumnDataSource,TapTool

source = ColumnDataSource(data=dict(
    x = [1, 2],
    y = [3, 4],
    url = ["http://google.com", "http://bing.com"],
))

p = figure(tools="tap")
p.circle('x', 'y', size=15, source=source)

code = """
selection = require("core/util/selection")
indices = selection.get_indices(source)
for (i = 0; i < indices.length; i++) {
    ind = indices[i]
    url = source.data['url'][ind]
    window.open(url, "_self")
}
"""

taptool = p.select(type=TapTool)
taptool.callback = CustomJS(args=dict(source=source), code=code)

output_file("/tmp/foo.html")

show(p)