Bokeh - 具有 Python 功能的 CustomJS 数据下载数据和提醒用户

Bokeh - CustomJS data with Python functions to Download data and Alert users

我正在尝试创建一个散景服务器(运行 Python -m bokeh serve my_pythonfile.py),我让用户修改一些我想在自定义函数。我试图在这里为我的 class 做一个简单的例子:

def __init__(self):
    self.data = 0
    self.click_me = self._get_click_button()
    self.save_data = self._get_save_data()

def _get_click_button(self) -> Button:
    click_me = Button(label='Add data')
    click_me.on_click(self.add_data)
    return click_me

def self.add_data(self):
    self.data += 1

def _get_save_data(self) -> Button:
    save = Button(label='Save data')
    callback = CustomJS(args={'data': self.return_data()}, code="""console.log(data);""")
    save.js_on_click(callback)
    return save

def return_data(self) -> int:
    return self.data

当我按下 Save data 按钮时,我总是在控制台中得到 0,我明白为什么,但我不知道如何获得 self.data 的实际数量,任何 ideas/tips?

我真正想做的是让用户下载一些数据(一个 json 文件),想到的一个解决方案是使用 html5 关键字 download.在另一种情况下,我想使用 alert 关键字让用户知道他输入了一些错误数据。

原生 int 值未在 Bokeh 服务器和客户端之间同步。

args={'data': self.return_data()} 本质上是 args={'data': 0}.

要在服务器和客户端之间同步对象,子类化 Model 并使用它。

from bokeh.core.properties import Int
from bokeh.models import Model
from bokeh.util.compiler import TypeScript


class MyModel(Model):
    __implementation__ = TypeScript("""
    import { Model } from "model";
    export class MyModel extends Model {
        constructor(attrs: any) {
            super(attrs);
        }
        static init_MyModel() {
            this.define(({ Int }) => ({
                data: [Int, 0] as any,
            }));
        }
    }
    """)

    data = Int

用法:

def __init__(self):
    self.model = MyModel(data=0)  # Modified
    self.click_me = self._get_click_button()
    self.save_data = self._get_save_data()

def _get_click_button(self) -> Button:
    click_me = Button(label='Add data')
    click_me.on_click(self.add_data)
    return click_me

def add_data(self):
    self.model.data += 1  # Modified

def _get_save_data(self) -> Button:
    save = Button(label='Save data')
    callback = CustomJS(args={'model': self.model}, code="""console.log(model.data);""")  # Modified
    save.js_on_click(callback)
    return save

# def return_data(self) -> int: # Removed
#     return self.data          # Removed