You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bokeh中如何让JavaScript端获取Python侧更新后的列表?

问题核心

普通Python列表不是Bokeh的可同步模型对象。当你把普通列表传给CustomJS的args时,Bokeh仅在初始化阶段将列表的初始值序列化传递给JavaScript,之后Python侧对列表的修改不会自动同步到JS端,所以JS里始终拿到的是初始空列表。

解决方案

使用Bokeh提供的可同步数据模型,这类对象能在Python和JavaScript之间保持状态同步,以下是两种常用方案:

方案1:用ColumnDataSource(推荐,适配多数场景)

ColumnDataSource是Bokeh中用于跨端同步数据的核心容器:

from bokeh.models import Button, CustomJS, ColumnDataSource

button = Button()
# 用ColumnDataSource存储列表数据,初始为空
source = ColumnDataSource(data={"my_list": []})

def update_list():
    current_list = source.data["my_list"]
    current_list.append(1)
    # 重新赋值data触发同步,让Bokeh感知数据变化
    source.data = {"my_list": current_list}

button.on_click(update_list)

button.js_on_click(CustomJS(args=dict(source=source), code="""
// 从数据源中获取最新列表
console.log(source.data.my_list);
"""))

方案2:用bokeh.models.List(轻量化列表同步)

如果仅需同步简单列表,可直接使用Bokeh的List模型:

from bokeh.models import Button, CustomJS, List

button = Button()
# 初始化空的可同步List
synced_list = List(default=[])

def update_list():
    # 直接修改List,内部自动同步到JS
    synced_list.append(1)

button.on_click(update_list)

button.js_on_click(CustomJS(args=dict(synced_list=synced_list), code="""
console.log(synced_list);
"""))
关键注意点
  • 只有继承自bokeh.models.Model的官方模型类,才能实现Python与JS的状态同步,普通Python对象(如list、dict)不具备该能力。
  • 使用ColumnDataSource时,修改数据后必须重新赋值source.data或调用source.change.emit(),否则Bokeh无法触发同步。
  • List模型无需手动触发同步,修改后会自动完成跨端状态更新。

内容的提问来源于stack exchange,提问作者Victor Le Couteur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:31:01