从散景中打开 URL,不使用 taptool

Open URL from bokeh, not using the taptool

我想使用 OpenURL 从散景中打开一个 URL,但是从按钮的回调中打开,而不是使用 taptool。下面的代码重现了我 运行 遇到的问题,即在将 taptool 与 OpenURL 结合使用时我可以打开新选项卡,但是当我在按钮回调中使用 OpenURL 时没有任何反应。 (大部分示例来自 bokeh 文档:http://docs.bokeh.org/en/0.12.5/docs/user_guide/examples/interaction_open_url.html

from bokeh.models import ColumnDataSource, OpenURL, TapTool
from bokeh.models.widgets import Button
from bokeh.plotting import figure, output_file, show
from bokeh.layouts import column, widgetbox
from bokeh.io import curdoc

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)

button = Button(label="Generate", button_type="success")
def button_callback():
    print('button callback')
    OpenURL(url="http://www.google.com")
button.on_click(button_callback)

doc = curdoc()
doc.add_root(column([p,widgetbox(button)]))
doc.title = "Hello World"

谢谢!

OpenURLCustomJS 的自定义版本,因此它仅在 JavaScript 中运行。它也是一个 class 而不是一个函数 - 你不能只构造一个 class OpenURL 的对象,你还必须使用它的其他方法来使它工作。

话虽如此,您不能将它与 Button 一起使用,因为 OpenURL 需要一个数据源来替换 URL 中的所有占位符。而且Button不能有数据源。

相反,您需要的是常规 CustomJS:

b.js_on_click(CustomJS(args=dict(urls=['https://www.google.com',
                                       'https://whosebug.com/']),
                       code="urls.forEach(url => window.open(url))"))

请注意,上述解决方案的工作方式取决于您的浏览器。例如。在我的例子中 Google Chrome 只打开了第一个 URL,我必须在生成的网页开始打开第二个 URL 之前明确允许弹出窗口].

而且你不需要 bokeh serve 来让它工作 - 它甚至可以在调用 saveshow.[=21 生成的静态网页上工作=]