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
相关产品推荐
相关产品推荐

