Rus*_*rdt 2 python widget bokeh
我想在不使用 JavaScript 的情况下创建自定义散景小部件,即不遵循有关添加自定义小部件的散景文档。下面的示例演示了在 PyQt4 中创建自定义小部件(我经常使用它),以及我希望在散景中工作的内容以及我收到的错误消息。
有没有其他方法可以在不使用 JavaScript 的情况下在散景中创建自定义小部件?具体来说,我正在尝试创建一个自定义滑块,每侧带有小 - 和 + 按钮,将滑块递增/递减 1 步。我想在许多应用程序中使用这个自定义小部件,所以我希望它定义为自己的类,并且 on_change 方法链接到滑块 on_change 方法。我想制作散景中的其他自定义小部件(没有 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))
Run Code Online (Sandbox Code Playgroud)
更新:我尝试创建的特定自定义小部件是一个滑块,每侧都有一个按钮(左侧标记为“-”,右侧标记为“+”),可将 Slider 值更改 1 步。这用于微调 Slider 的值,因此不需要鼠标精确击中目标值。我通过链接默认的 Slider 和 Button 对象创建了这个自定义小部件,它在浏览器中呈现,但回调功能不起作用(特别是 Slider 'on_change' 方法)。
这个自定义小部件是否可以直接使用散景和 JS 实现?是否有在线参考可以提供提示而无需深入研究 JS。
Bokeh 是一个用于在现代浏览器(或嵌入式 HTML 小部件)中生成绘图和可视化应用程序的库。它由两个基本部分组成。Bokeh 的 Python 端实际上只是一个复杂的“包装器”或“绑定”,最终生成一个声明性的 JSON 文档,它反过来驱动一个 JavaScript 库 (BokehJS),它实际上在浏览器中完成所有工作。
扩展 Bokeh 必然意味着提供该等式的两边:您必须提供扩展的(通常非常少)python 声明,它实际上只是指定自动生成我上面描述的 JSON 格式所需的信息。并且您还必须为扩展提供 JavaScript(或 TypeScript)实现,它实际上在浏览器中完成所有工作。
由于浏览器无法运行 Python 代码,因此实现必须是 JavaScript。
有一些库,例如 Flexx 和 Brython,可以将 Python“转换”为 JavaScript。您可能会发现它们作为一种避免直接编写 JavaScript 的方法很有用,但这些库在某些用例中通常具有怪癖和特定缺陷,因此 YMMV。
这是一个完整的示例,它使用CustomJS按钮上的回调来更新滑块:
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))
Run Code Online (Sandbox Code Playgroud)