从散景中打开 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"
谢谢!
OpenURL
是 CustomJS
的自定义版本,因此它仅在 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
来让它工作 - 它甚至可以在调用 save
或 show
.[=21 生成的静态网页上工作=]
我想使用 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"
谢谢!
OpenURL
是 CustomJS
的自定义版本,因此它仅在 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
来让它工作 - 它甚至可以在调用 save
或 show
.[=21 生成的静态网页上工作=]