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

2023-11-22

真正的(一般)问题

我是 Bokeh 新手,我正在尝试构建一个可以根据小部件提供的输入动态更新的图。然而,对于大多数小部件来说,Python 回调的使用并没有完整记录,因此我陷入了困境。

  1. 我如何知道应该使用哪种小部件方法来附加我的回调?我可以通过在交互式控制台中探测小部件属性来猜测可用的选择,但这并不优雅,而且我确信它写在文档中的某个地方。
  2. 前提是我知道要使用的方法(例如on_event or on_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 回调 and Python 回调,是 Bokeh 中非常强大的工具,可以附加到任何 Bokeh 模型元素。此外,您还可以通过编写自己的 Bokeh 功能来扩展 Bokeh 功能使用 TypeScript 进行扩展(最终编译为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()

The attr可以是任何小部件类(或其基类)属性。因此您需要经常咨询散景参考页面。扩展 JSON 原型还有助于找出支持哪些属性,例如看着Div我们无法直接看到id, name, style or 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
}

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

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

使用上述方法可以检查哪些小部件属性您可以在回调中使用。到那个时刻events我建议你看看并探索bokeh.eventsIDE 中的类。您可以找到每个事件的详细描述。随着时间的推移,当使用程序员的直觉来选择您的小部件支持的正确事件时,它会自然而然地发生(所以没有button_click for Plot and no pan活动为Button但反过来)。

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

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

基本上,您需要知道所有 Python 对象在 BokehJS 中都有其等效项,这样您就可以在两个领域中以相同的方式使用它们(当然,有一些语法差异)。

本文档例如,显示 ColumnDataSource 有一个“选定”属性,因此您可以检查点source.selected.indices并查看选择了绘图上的哪个点或在您的情况下:选择了哪些表行。您可以在 Python 代码和浏览器中设置断点,并检查 Python 或 BokehJS 数据结构。它有助于设置环境变量BOKEH_MINIFIED to no在 IDE(运行配置)或终端(例如BOKEH_MINIFIED=no python3 main.py) 运行代码时。这将使在浏览器中调试 BokehJS 变得更加容易。

这是你的代码(对“pure Bokeh”v1.0.4 稍作修改,因为我没有安装 Jupiter Notebook)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 在没有互联网连接的计算机上使用 Scala

    我是 Scala 新手 如果问题绝对显而易见 我很抱歉 我的计算机上安装了 Eclipse Photon 想要编辑 Scala 代码并生成可运行的 jar 棘手的部分是我的计算机 Centos7 无法访问互联网 我记住两个潜在的问题 手动下
  • 如何在具有角度嵌套数据组的材料表中显示拆分标题

    当数据作为对象的嵌套数组出现时 我在材料表中显示数据时遇到问题 我想显示当前显示在 stackblitz 中的表格 如果我用我的更改现有数据newData变量它将开始破坏整个表 谁能指导我如何通过材料表中的一组嵌套数据实现拆分标题功能 我想
  • iPad 上具有自定义尺寸的 SwiftUI Sheet() 模式

    如何使用 SwiftUI 控制 iPad 上模态表的首选演示大小 我很惊讶在谷歌上找到这个问题的答案是多么困难 另外 了解模式是否通过向下拖动 取消 或实际执行自定义积极操作来关闭的最佳方法是什么 以下是我在 iPad 上使用 SwiftU
  • 找出两个缺失的数字

    我们有一台内存为 O 1 的机器 我们想要通过n第一遍中的数字 一个接一个 然后我们排除这两个数字 我们将通过n 2号码到机器 编写一个算法来查找缺失的数字 可以使用 O 1 内存来完成 您只需要几个整数来跟踪一些运行总和 整数不需要 lo
  • Autofac 和 ASP .Net MVC 4 Web API

    我在用Autofac用于我的 ASP Net MVC 4 项目中的 IoC Autofac 在初始化存储库并将其传递到API控制器 我确信我的配置中缺少某些内容 这是我导航到时遇到的错误 https localhost 44305 api
  • 在 Android 上强制执行 Expo 上的 LTR

    我正在使用 React Native 和 Expo 创建一个应用程序 但找不到强制 LTR 从左到右 方向的解决方案 我的一些用户的手机支持 RTL 语言 但我只有英语和挪威语 因此以英语显示 RTL 文本没有意义 我也使用 i18next
  • DbContext配置?

    数据库上下文 public class HaberPortalDB DbContext public DbSet
  • 有没有办法在 Visual Studio 2010 中突出显示当前活动的代码块?

    在 Visual Studio 2010 中 如果将鼠标悬停在小 减号上 它将突出显示该代码块 我的问题是 有没有办法让您在其中编码时始终突出显示该块 这样 当我在方法和类之间跳转时 我当前正在处理的任何块都会突出显示 以帮助我的眼睛快速聚
  • Angular Access ng-template 的内部组件

    假设我们有一个名为TopComponent使用这样的模板
  • 在 .CSS 文件中创建一个变量以在该 .CSS 文件中使用[重复]

    这个问题在这里已经有答案了 可能的重复 避免 CSS 中重复的常量 我们有一些在 CSS 表中重复使用的 主题颜色 有没有办法设置一个变量然后重用它 E g css OurColor Blue H1 color OurColor 不要求选择
  • 相当于 Python 的列表排序和 key / Schwartzian 变换

    在 Python 中 给定一个列表 我可以按关键函数对其进行排序 例如 gt gt gt def get value k print heavy computation for k return a 100 b 30 c 50 d 0 k
  • 手动将 JComponent 放置在 JPanel 内

    我想以编程方式将 JLabel 移动到 JPanel 内的特定位置 我努力了setLocation int x int y 但它不起作用 我试图不使用任何布局管理器 这是一个关于如何在不使用布局管理器的情况下布局组件的精彩教程 http j
  • UITextView 中的文本垂直居中

    我想将文本居中垂直里面一个大UITextView填满整个屏幕 因此 当文本很少时 说几个单词 它会按高度居中 这不是一个关于文本居中 可以在IB中找到的属性 的问题 而是关于放置文本的问题垂直就在中间UITextView if文字很短 所以
  • 以编程方式将 svg 转换为图像

    我正在尝试将 svg 转换为图像 我一直在研究几种工具 但仍然无法实现这一点 1 SVG渲染引擎但我遇到了麻烦 因为它没有文档 这是我的代码 using FileStream fileStream File OpenRead C sampl
  • 使用 Python 删除或删除 CSV 文件中的最后一列

    我有一个包含 5 列的 CSV 文件 使用Python 如何删除最后一列 示例中的header5 我是否缺少一种简单的方法 或者我是否必须循环遍历 CSV 中的所有行并从最后一列中删除每个值 这仍然可能会给我留下不需要的前置逗号 我在 CS
  • 使用 SQLAlchemy 和多处理挂入 Python 脚本

    考虑以下 Python 脚本 它使用 SQLAlchemy 和 Python 多处理模块 这是 Debian squeeze 上的 Python 2 6 6 8 b1 默认 和 SQLAlchemy 0 6 3 3 默认 这是一些实际代码的
  • ListView 内的 Horizo​​ntalScrollView:较小的垂直滚动停止水平滚动

    在我的示例活动中 我有 一个ListView包含 包含多个Horizo ntalScrollView 一组TextView 但水平滚动体验相当糟糕 当我启动水平滚动 或快速滑动 时 我必须非常小心才能使其正常工作 一旦水平滚动包含 小的 垂
  • 使用 git filter-branch 删除除文件列表之外的所有内容的历史记录

    我正在尝试在两个 git 存储库之间移动一些文件repo1 and repo2 我有一个要移动的文件的简短列表 保留历史记录 三个要移动的文件repo1 libraryname file1 libraryname file2 tests l
  • 使用JarJar重新打包工具

    我已将 Web 应用程序部署到 Google 应用程序引擎 并且我的 Web 服务使用 jersey 1 14 框架 当我尝试使用或调用 GAE 上的 Web 服务时 我收到 java lang InknownClassChangeErro
  • 如何获取 Bokeh 小部件事件和属性的列表(可用于触发 Python 回调)

    真正的 一般 问题 我是 Bokeh 新手 我正在尝试构建一个可以根据小部件提供的输入动态更新的图 然而 对于大多数小部件来说 Python 回调的使用并没有完整记录 因此我陷入了困境 我如何知道应该使用哪种小部件方法来附加我的回调 我可以