我想在不使用 JavaScript 的情况下创建自定义 Bokeh 小部件,即不遵循 Adding A Custom Widget 上的 Bokeh 文档| .下面的示例演示了在 PyQt4 中创建自定义小部件(我经常使用它),以及我希望在 Bokeh 中工作的内容以及我收到的错误消息。
有没有其他方法可以在不使用 JavaScript 的情况下在 Bokeh 中创建自定义小部件?具体来说,我正在尝试创建一个自定义 slider ,每侧都有小的 - 和 + 按钮,可以将 slider 递增/递减 1 步。我想在许多应用程序中使用这个自定义小部件,因此我希望将它定义为自己的类,并使用链接到 slider on_change 方法的 on_change 方法。我想在 Bokeh 中制作其他自定义小部件(没有 JS!),我想知道这是否可能。
# this works as a base to develop custom PyQt4 widgets
from PyQt4 import QtGui
import sys
class NewWidget(QtGui.QWidget):
def __init__(self):
super().__init__()
app = QtGui.QApplication([])
widget = NewWidget()
widget.show()
sys.exit(app.exec_())
# this does not work as a base to develop custom bokeh widgets
# when run, a tab opens with the message
# Bokeh Error
# Model `NewWidget' does not exist. This could be due to a widget
# or a custom model not being registered before first usage.
from bokeh.plotting import show
from bokeh.layouts import widgetbox
from bokeh.models.widgets import Widget
class NewWidget(Widget):
def __init__(self):
super().__init__()
new = NewWidget()
show(widgetbox(new))
更新:我试图创建的特定自定义小部件是一个 slider ,每侧都有一个按钮(左侧标记为“-”,右侧标记为“+”),它按 1 步更改 slider 值。这用于微调 Slider 的值,因此不需要鼠标准确地击中目标值。我通过链接默认的 Slider 和 Button 对象创建了这个自定义小部件,它在浏览器中呈现,但回调功能不起作用(特别是 Slider 'on_change' 方法)。
这个自定义小部件是否可以直接使用 Bokeh 和 JS 实现?是否有在线引用可以提供提示而无需深入研究 JS。
请您参考如下方法:
Bokeh 是一个用于在现代浏览器(或嵌入式 HTML 小部件)中生成绘图和可视化应用程序的库。它由两个基本部分组成。 Bokeh 的 Python 端实际上只是一个复杂的“包装器”或“绑定(bind)”,它最终生成一个声明性 JSON 文档,该文档反过来驱动一个 JavaScript 库 (BokehJS),它实际上在浏览器中完成所有工作。
扩展 Bokeh 必然意味着提供等式的两边:您必须提供一个(通常非常小的)扩展的 python 声明,它实际上只是指定自动生成我上面描述的 JSON 格式所需的信息。而且您还必须为扩展提供 JavaScript(或 TypeScript)实现,它实际上在浏览器中完成所有工作。
由于浏览器无法运行 Python 代码,因此实现必须是 JavaScript。
有一些库,例如 Flexx 和 Brython,可以将 Python“转译”成 JavaScript。您可能会发现它们作为一种避免直接编写 JavaScript 的方法很有用,但这些库在某些用例中通常有怪癖和特定缺陷,因此 YMMV。
这是一个完整的示例,它在按钮上使用 CustomJS 回调来更新 slider :
from bokeh.models import Button, CustomJS, Slider
from bokeh.layouts import row
from bokeh.io import output_file, show
slider = Slider(start=0, end=10, value=0, step=0.1)
button = Button()
button.callback = CustomJS(args=dict(slider=slider), code="""
slider.value += 0.1
""")
output_file("foo.html")
show(row(slider, button))
