【问题标题】:Bokeh: JS callback when double-click on circle散景:双击圆圈时的JS回调
【发布时间】:2016-09-10 12:38:22
【问题描述】:

单击圆圈时我在网页上显示一些信息,现在我想在双击时添加一些交互:打开一个新标签页,希望使用OpenURL加载一个网址。

这是我当前的代码:

p = bokeh.plotting.figure(tools=TOOLS)
cr = p.circle(y_true[:, 1], y_pred[:, 1], size=5, source=source)

taptool = p.select(type=bokeh.models.TapTool)
taptool.callback = bokeh.models.CustomJS(args={'circle': cr.data_source},
        code=self.show_data_callback())

show_data_callback 只是返回一个带有 JS 代码的字符串,显示有关单击的圆圈的信息。

【问题讨论】:

  • 目前的TapTool只支持单击。使其也可配置为双击可能并不困难。如果您有兴趣通过 PR 来添加此功能,我们总是很乐意回答问题并帮助人们开始 Bokeh 开发。或者 [Bokeh 是可扩展的],您当然可以编写自定义工具扩展来执行此操作。

标签: javascript python callback bokeh


【解决方案1】:

按照here 中的教程并在散景聊天的帮助下,我创建了一个扩展,其中包含不同的单击和双击操作:

from bokeh.core.properties import Instance
from bokeh.io import output_file, show
from bokeh.models import ColumnDataSource, TapTool, CustomJS, OpenURL
from bokeh.plotting import figure

output_file('tool.html')

JS_CODE = """
p = require "core/properties"
TapTool = require "models/tools/gestures/tap_tool"

class NewTapToolView extends TapTool.View

  _get_canvas_position: (e) ->
    canvas = @plot_view.canvas
    vx = canvas.sx_to_vx(e.bokeh.sx)
    vy = canvas.sy_to_vy(e.bokeh.sy)
    return [vx, vy]

  _tap: (e) ->
    console.log('click')
    [vx, vy] = @_get_canvas_position(e)
    append = e.srcEvent.shiftKey ? false
    @_select(vx, vy, true, append)

  _doubletap: (e) ->
    console.log('double click')
    [vx, vy] = @_get_canvas_position(e)
    append = false
    @_select(vx, vy, true, append)

class NewTapTool extends TapTool.Model
  default_view: NewTapToolView
  type: "NewTapTool"

  tool_name: "New Tap Tool"

  @define { source: [ p.Instance ] }

module.exports =
  Model: NewTapTool
  View: NewTapToolView
"""


class NewTapTool(TapTool):
    __implementation__ = JS_CODE
    source = Instance(ColumnDataSource)


x = y = [i for i in range(10)]
source = ColumnDataSource(data=dict(x=x, y=y))

plot = figure(x_range=(0, 10), y_range=(0, 10), tools=[NewTapTool(source=source)])
plot.title.text = "Double click on a dot to test"
plot.circle('x', 'y', source=source, size=10)

newtaptool = plot.select(type=TapTool)
newtaptool.callback = OpenURL(url="https://en.wikipedia.org/")

show(plot)

该示例只是在双击一个圆圈时打开 Wikipedia。在_tap 函数中,可以自定义单击的行为。希望对你有帮助!

【讨论】:

  • 您使用的是哪个版本的散景? (你的代码为我呈现了一个空白画布)
  • 是否可以通过修改代码来捕获右键?
  • 我还没有看到在当前散景版本的事件定义中捕获右键单击的任何方法:github.com/bokeh/bokeh/blob/…。 Bokeh 依赖于hammerjs,它也面向移动设备,也许这就是原因。
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多