Javascript bokeh中的OpenURL-在同一选项卡中打开

Javascript bokeh中的OpenURL-在同一选项卡中打开,javascript,python,html,bokeh,Javascript,Python,Html,Bokeh,考虑下面的例子,有没有一种方法可以调整TapTool,这样当我点击一个圆圈时,我会被带到同一选项卡上的url,而不是打开一个新选项卡?docstring表明,唯一的行为是打开一个新的选项卡,但是可能有CustomJS解决方法或者其他一些破解方法来解决这个问题 from bokeh.models import ColumnDataSource, OpenURL, TapTool from bokeh.plotting import figure, output_file, show output

考虑下面的例子,有没有一种方法可以调整TapTool,这样当我点击一个圆圈时,我会被带到同一选项卡上的url,而不是打开一个新选项卡?docstring表明,唯一的行为是打开一个新的选项卡,但是可能有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,但没有成功(借鉴了一些javascript,但对于如何实现它却有点不知所措)。这将导致没有链接打开:

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

taptool = p.select(type=TapTool)
taptool.callback = callback
我还尝试使用OpenURL的
标记
关键字将链接当作
标记。这是一次盲目的尝试,因为我找不到任何关于如何正确使用这个
标记的信息。这里运气不好

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

我知道Bokeh还是很新的,所以这个功能可能还不可用。我仍然认为,如果你知道足够多的javascript(我显然不知道),就应该有一个解决办法

标签
是一个尘土飞扬的特性,它们与此无关。它们只允许您将一些任意位的信息附加到Bokeh
模型
,如果您稍后查询对象图以查找该特定模型,这会有所帮助


从Bokeh
0.12.3
开始,
OpenURL
不支持此功能,它只调用
窗口。open

窗口的
名称
参数添加新属性。打开
只需要几行代码。我建议在上打开一个功能请求问题。如果你有兴趣建立一个公关来实现这个功能,我们很乐意帮助新的贡献者开始


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

callback = CustomJS(args=dict(source=source), code="""          
    window.open("http://foo.com" ,"_self");
    """)    
如果您的数据源中有一列具有完整的URL,并且您希望根据所选索引选择一列,则需要执行类似于
OpenURL
回调的操作:从数据源中获取所选索引,然后使用所选索引从数据源中的列中获取URL,然后调用
窗口。打开
。下面是一个完整的示例:

从bokeh.plotting导入图形,输出_文件,显示 从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)
source=ColumnDataSource(数据=dict(
x=[1,2],
y=[3,4],
url=[”http://google.com", "http://bing.com"],
))
p=图(tools=“tap”)
p、 圆('x','y',大小=15,源=源)
代码=”“
选择=需要(“核心/util/selection”)
索引=选择。获取索引(源)
对于(i=0;i
标签是一个尘土飞扬的特性,它们与此无关。它们只允许您将一些任意位的信息附加到Bokeh
模型
,如果您稍后查询对象图以查找该特定模型,这会有所帮助


从Bokeh
0.12.3
开始,
OpenURL
不支持此功能,它只调用
窗口。open

窗口的
名称
参数添加新属性。打开
只需要几行代码。我建议在上打开一个功能请求问题。如果你有兴趣建立一个公关来实现这个功能,我们很乐意帮助新的贡献者开始


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

callback = CustomJS(args=dict(source=source), code="""          
    window.open("http://foo.com" ,"_self");
    """)    
如果您的数据源中有一列具有完整的URL,并且您希望根据所选索引选择一列,则需要执行类似于
OpenURL
回调的操作:从数据源中获取所选索引,然后使用所选索引从数据源中的列中获取URL,然后调用
窗口。打开
。下面是一个完整的示例:

从bokeh.plotting导入图形,输出_文件,显示 从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)
source=ColumnDataSource(数据=dict(
x=[1,2],
y=[3,4],
url=[”http://google.com", "http://bing.com"],
))
p=图(tools=“tap”)
p、 圆('x','y',大小=15,源=源)
代码=”“
选择=需要(“核心/util/selection”)
索引=选择。获取索引(源)
对于(i=0;i
非常感谢您。我想开始贡献,所以谢谢你的链接。由于某种原因,当我点击这些点时,你的完整示例没有给我任何信息。另外,我需要
window.open()
命令中的“\u self”参数。是吗?哦,是的,很抱歉我删除了它,因为我正在查看一些JS控制台输出,这使它变得很困难,我将把它放回答案中。再次感谢。我希望在这之后不会打扰你太多。是否有理由将
window.open()
放在循环内部而不是外部?一个无关的问题是,只要我有最新版本的Bokeh,我是否就可以使用“core/util/selection”?固定url代码段工作正常。如果我只添加完整示例中的
selection=require()
行,事情就不起作用了。很难诊断,因为没有抛出错误。是的,多个glyph重叠可能有多个节索引。这将为所有人打开一个窗口。如果你想要一些不同的东西,比如随便挑第一个,你可以这样做。你说的我不清楚