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

如何用Python+Bokeh Server实现滑块更新圆形半径?

解决Bokeh Server滑块更新圆形半径的500错误问题

看起来你遇到的核心问题是没有正确使用Bokeh的ColumnDataSource管理动态数据,再加上几处API调用的小错误,导致了服务器内部错误。让我一步步帮你修正代码:

问题分析

  1. 静态变量无法动态更新:你用普通变量size=20控制圆形大小,但Bokeh无法监听普通变量的变化,必须用ColumnDataSource作为中间层同步前后端数据。
  2. 滑块绑定参数缺失:slider.on_change()需要指定要监听的属性(这里是'value'),你漏掉了这个参数,导致回调函数无法正确触发。
  3. 错误的更新逻辑:尝试修改普通变量的data属性完全无效,必须更新数据源的data字典才能触发视图更新。
  4. 冗余的Notebook配置:output_notebook()是给Jupyter Notebook用的,Bokeh Server独立应用不需要这个配置。

修正后的完整代码

from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
from bokeh.layouts import column
from bokeh.models import Slider, ColumnDataSource
from bokeh.plotting import figure

# Webpage function, called when creating the webpage
def make_page(doc):
    # 用ColumnDataSource管理动态数据,初始半径设为20(对应两个点)
    source = ColumnDataSource(data=dict(radius=[20, 20]))
    
    def update(attr, old, new):
        # 更新数据源中的radius值,两个点同步使用滑块的新值
        source.data = dict(radius=[new, new])
    
    plot = figure(plot_width=400, plot_height=400)
    # 将圆形的size绑定到数据源的radius字段
    plot.circle([1,2], [4,8], size='radius', color='blue', alpha=0.5, source=source)
    
    slider = Slider(start=0, end=30, value=20, step=1, title="Circle Radius")
    # 监听滑块的value变化,触发update回调
    slider.on_change('value', update)
    
    # 将滑块和绘图添加到文档
    doc.add_root(column(slider, plot))

# 创建应用并启动服务器
apps = {'/': Application(FunctionHandler(make_page))}
server = Server(apps, port=5000)
server.start()

# 可选:添加前台运行代码(脚本运行时需要)
print(f"Server running at http://localhost:{server.port}")
server.io_loop.start()

关键修改说明

  • 引入ColumnDataSource:这是Bokeh实现交互式更新的核心,所有动态数据都要放在这里,前端会自动监听数据源变化并更新视图。
  • 绑定圆形大小到数据源字段:plot.circle()的size参数使用字符串'radius',表示从source中读取radius字段的值,而非固定数值。
  • 正确绑定滑块回调:slider.on_change('value', update)指定监听滑块的value属性变化,滑块值改变时自动调用update函数。
  • 正确更新数据源:在update函数中修改source.data来更新半径值,Bokeh会自动同步到前端绘图。

运行修正后的代码后,访问http://localhost:5000就能看到可通过滑块调整圆形大小的交互式绘图了。

内容的提问来源于stack exchange,提问作者Deen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:17:54