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

M4urice

真正的(一般)问题

我是Bokeh的新手,我正在尝试构建一个可根据小部件提供的输入动态更新的图。但是,对于大多数小部件,Python回调的用法尚未完全记录下来,因此我陷入了困境。

  1. 我怎么知道应该使用哪种小部件方法来附加我的回调?我可以通过在交互式控制台中探查widgets属性来猜测可用的选择,但这并不优雅,而且我敢肯定它写在文档中的某个地方。
  2. 只要我知道要使用的方法(例如on_eventon_change),我仍然必须弄清楚其签名和参数。例如,如果我使用on_change,我可以监视哪些窗口小部件属性?
  3. 一旦知道了我可以监视的属性,就如何知道事件将产生的数据结构?

一些更多的上下文和(不是有用的)特定问题

这是一个合适的例子。我正在使用此示例中的笔记本嵌入式服务器作为练习,我想将滑块替换为DataTable任意值。这是我目前拥有的代码:

from bokeh.layouts import column
from bokeh.models import ColumnDataSource, DataTable
from bokeh.plotting import figure
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):
        # This is the old callback from the example. What is "new" when I use 
        # a table widget?
        if new == 0:
            data = df
        else:
            data = df.rolling('{0}D'.format(new)).mean()
        source.data = ColumnDataSource(data=data).data

    table = DataTable(source=source_table, 
                      columns=[TableColumn(field="alpha", title="Alpha"),
                               TableColumn(field="num", title="Num")])
    # How can I attach a callback to table so that the plot gets updated 
    # with the "num" value when I select a row?
    # table.on_change("some_attribute", callback)

    doc.add_root(column(table, plot))

show(modify_doc)
托尼

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

JavaScript回调Python回调是Bokeh中非常强大的工具,可以附加到任何Bokeh模型元素。另外,您可以通过使用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原型有助于找出哪些属性的支持如寻找事业部,我们不能直接看到idnamestyletext属性,这来源于其基类。但是,所有这些属性都存在于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中查看和探索该类。您可以在其中找到每个事件的扩展说明。随着程序员的直觉选择小部件支持的正确事件,随着时间的流逝自然会自然而然地发生(因此,没有理由button_clickPlot也没有pan事件,Button只有相反的方式)。

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

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

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

例如,该文档显示ColumnDataSource具有“ selected”属性,因此对于点,您可以检查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)

结果:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

修改Tkinter Entry小部件时,如何获取事件回调?

如何为Text小部件Flutter实现OnPressed回调

如何在音轨的特定点触发事件或回调?

收听ckeditor小部件事件

Python Bokeh将其他参数发送到小部件事件处理程序

如何从chromecast android获取播放和停止事件回调

散景小部件为单个事件调用CustomJS和Python回调吗?

类回调函数,用于何时将小部件路由到/从中路由

如何访问和更改列表中特定窗口小部件的属性值

从多个小部件触发相同的bokeh回调

Flutter回调-从子级中删除列表中的小部件

设置Kendo小部件事件的回调函数

如何以编程方式触发带有按钮的可排序小部件的更新回调?

获取QGuiApplication的小部件列表

如何防止排队的事件回调触发?

Dojo:在事件侦听器回调中维护对窗口小部件的引用

如何获取小部件的名称Python Tkinter

Python Tkinter:如何在<Destroy>事件回调中从ScrolledText小部件获取文本?

Tkinter Entry小部件之后的事件回调

如何在事件中获取小部件名称

如何使用 Pyqt 小部件创建键盘和鼠标事件

如何捕获 Bokeh TextInput 小部件上的回调函数调用返回的结果?

如何在回调时替换 Kivy 小部件?

如何在 Bokeh 中为多选小部件实现 Javascript 回调

如何触发小部件内的事件?

InkWell 用于小部件列表?

带有 onTouched 和 onReleased 回调的内置小部件?

tkinter 小部件属性列表

如何訪問另一個小部件事件處理程序中的小部件:Tkinter