您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何获取Bokeh小部件事件和属性的列表(可用于触发Python回调)

如何获取Bokeh小部件事件和属性的列表(可用于触发Python回调)

该答案是针对bokeh v1.0.4给出的,可能与最新文档不兼容

JavaScript的回调和Python的回调, 在背景虚化非常强大的工具,并且可以连接到任何背景虚化模型元素。另外,您可以通过使用 TypeScript编写自己的扩展来扩展bokeh功能(最终编译为JS)

可以使用以下两种方法之一添加JS回调:

Model.js_on_event('event', callback)
Model.js_on_change('attr', callback)

Python回调主要用于小部件:

Widget.on_event('event, onevent_handler)
Widget.on_change('attr', onchange_handler)
Widget.on_click(onclick_handler)

每个小部件的事件处理程序的确切函数签名可以是:

onevent_handler(event)
onchange_handler(attr, old, new) 
onclick_handler(new)
onclick_handler()

attr可以是任何部件类(或它的基类)属性。因此,您始终需要查阅bokeh参考 页。还扩大了JSON原型有助于找出哪些属性支持如寻找事业部,我们不能直接看到id,name,style或text属性,这来源于其基类。但是,所有这些属性都存在于Div的JSON原型中,因此受Div支持

{
  "css_classes": [],
  "disabled": false,
  "height": null,
  "id": "32025",
  "js_event_callbacks": {},
  "js_property_callbacks": {},
  "name": null,
  "render_as_text": false,
  "sizing_mode": "fixed",
  "style": {},
  "subscribed_events": [],
  "tags": [],
  "text": "",
  "width": null
}

回到您的问题:很多时候,您可以使用 不同的方法获得相同的结果。

据我所知,没有一种很好的方法可以列出每个 小部件的所有受支持的事件,但是阅读文档并深入研究基类会 大有帮助。

使用上述方法,可以检查可以在回调中使用的窗口小部件 属性。当涉及到事件时,我 建议您bokeh.events在IDE中查看和探索该类。您 可以在其中找到每个事件的扩展说明。随着时间的推移它会 使用你的程序员的直觉时,选择正确的情况下自然地 ,你的widget支持(所以没有button_click了Plot,没有pan活动 的Button,但周围的其他方法)。

决定将回调附加到哪个小部件(模型元素)以及 要选择哪种方法或将回调绑定到哪个事件,这主要取决于您: 哪个用户操作应触发您的回调?

因此,您可以将JS回调附加到任何小部件(值更改,滑块 移动等),任何工具(TapTool,HoverTool等),data_source(单击 字形),绘制画布(例如,单击a之外的区域)字形)或绘图范围 (缩放或平移事件)等…

基本上,您需要了解所有Python对象在 bokehJS中都有它们的等效项,因此您可以在两个域中以相同的方式使用它们( 当然,在语法上有所不同)。

该 文档 显示的例子ColumnDataSource有一个“选择”属性,以便为 点,你可以检查source.selected.indices,看看哪些点上的 情节,你的情况选择或类似:表中的行选择哪些。您可以 在Python中以及在浏览器中的代码中设置断点,并检查 Python或bokehJS数据结构。在运行代码时,将环境变量 bokeh_MINIFIED设置no为在IDE(运行配置)或终端 (例如bokeh_MINIFIED=no python3 main.py)中设置。这将使 在浏览器中调试bokehJS更加容易。

这是您的代码(由于未 安装Jupiter Notebook,因此对“ pure bokeh” v1.0.4做了一些修改

from bokeh.layouts import column
from bokeh.models import ColumnDataSource, DataTable, TableColumn
from bokeh.plotting import figure, curdoc
from bokeh.io import show, output_notebook
from bokeh.sampledata.sea_surface_temperature import sea_surface_temperature

# output_notebook()
def modify_doc(doc):
    df = sea_surface_temperature.copy()
    source = ColumnDataSource(data = df)
    source_table = ColumnDataSource(data = {"alpha": [s for s in "abcdefgh"],
                                            "num": list(range(8))})

    plot = figure(x_axis_type = 'datetime', y_range = (0, 25),
                  y_axis_label = 'Temperature (Celsius)',
                  title = "Sea Surface Temperature at 43.18, -70.43")
    plot.line('time', 'temperature', source = source)

    def callback(attr, old, new):  # here new is an array containing selected rows
        if new == 0:
            data = df
        else:
            data = df.rolling('{0}D'.format(new[0])).mean()  # asuming one row is selected

        source.data = ColumnDataSource(data = data).data

    table = DataTable(source = source_table,
                      columns = [TableColumn(field = "alpha", title = "Alpha"),
                                 TableColumn(field = "num", title = "Num")])
    source_table.selected.on_change('indices', callback)

    doc().add_root(column(table, plot))

modify_doc(curdoc)
# show(modify_doc)

Result:

enter image description
here

python 2022/1/1 18:39:57 有295人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶