【发布时间】:2022-02-22 15:38:40
【问题描述】:
我正在尝试从散景服务器中的另一个线程更新 Slope y_intercept。但我无法触发 js_on_change,似乎甚至没有生成 javascript 代码。有人可以让我这里有什么问题吗?这是整个代码(更新为使用 add_periodic_callback()):
#!/usr/bin/env python3
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slope, CustomJS
from bokeh.plotting import figure
from bokeh.server.server import Server
import pandas as pd
source = ColumnDataSource()
n = 0
def update():
global n
source.data = pd.DataFrame({"y": [n]})
print(f"{source.data=}")
n += 1
def bkapp(doc):
plot = figure(y_range=(-10, 10))
plot.line([-10, 10], [-10, 10])
slope = Slope(gradient=0, y_intercept=0, line_color='black')
plot.add_layout(slope)
source.js_on_change('data', CustomJS(
args=dict(ds=source, slopes=slope), code="""
console.log("whereismycode");
slope.y_intercept = ds.data["y"][0];
"""
))
doc.add_root(plot)
doc.add_periodic_callback(update, 5000)
server = Server({'/': bkapp}, port=5103, num_procs=1)
server.start()
if __name__ == '__main__':
print(f'address = {server.address}, port = {server.port}')
server.io_loop.add_callback(server.show, "/")
server.io_loop.start()
【问题讨论】:
-
如果您希望
update在固定的时间间隔内继续发生,那么 Bokeh 的内置add_periodic_callback似乎是一个更好的选择。否则,您将需要执行docs.bokeh.org/en/latest/docs/user_guide/… 中描述的进程,其中线程调用add_next_tick_callback。 -
@bigreddot,我更新了代码,问题是一样的
-
您已将
plot添加为文档根目录,但您在哪里告诉它source是文档的一部分?它怎么知道看它?是我不明白的散景魔法吗? -
@TimRoberts,我也对这部分感到困惑,我怎么能告诉散景这个数据源应该在文档中使用而不在 python 代码中使用它? (但只能在 javascript 中使用)
-
使用这个方法:stackoverflow.com/questions/68683190/…,我触发了回调