添加没有 JavaScript 的自定义 python 散景小部件
add a custom python bokeh widget without JavaScript
我想在不使用 JavaScript 的情况下创建自定义散景小部件,即不遵循 Adding A Custom Widget 上的散景文档。下面的示例演示了在 PyQt4 中创建自定义小部件(我经常使用它),以及我希望在散景中工作的内容以及我收到的错误消息。
有没有其他方法可以在不使用 JavaScript 的情况下在散景中创建自定义小部件?具体来说,我正在尝试创建一个自定义滑块,每侧都有小的 - 和 + 按钮,可以将滑块递增/递减 1 步。我想在许多应用程序中使用此自定义小部件,因此我希望将其定义为自己的 class,并使用 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))
更新:我尝试创建的特定自定义小部件是一个滑块,两侧各有一个按钮(左侧标记为“-”,右侧标记为“+”),可将滑块值更改 1 步.这用于微调 Slider 的值,因此不需要鼠标准确地击中目标值。我通过链接默认的 Slider 和 Button 对象创建了这个自定义小部件,它在浏览器中呈现,但回调功能不起作用(特别是 Slider 'on_change' 方法)。
这个自定义小部件是否可以直接使用散景和 JS 实现?是否有在线参考可以提供提示而无需深入研究 JS。
Bokeh 是一个用于在现代浏览器(或嵌入式 HTML 小部件)中生成绘图和可视化应用程序的库。它由两个基本部分组成。 Bokeh 的 python 端实际上只是一个复杂的 "wrapper" 或 "binding",它最终会生成一个声明性 JSON 文档,进而驱动一个 JavaScript 库(BokehJS ) 实际上在浏览器中完成所有工作。
扩展 Bokeh 必然意味着提供等式的两边:您必须提供(通常非常小的)python 扩展声明,实际上只是指定自动生成 [=38] 所需的信息=] 我上面描述的格式。而且您还必须为扩展提供一个 JavaScript(或 TypeScript)实现,它实际上在浏览器中完成所有工作。
由于浏览器无法 运行 Python 代码,实现 必须 JavaScript.
Flexx 和 Brython 等库可以 "transpile" 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))
我想在不使用 JavaScript 的情况下创建自定义散景小部件,即不遵循 Adding A Custom Widget 上的散景文档。下面的示例演示了在 PyQt4 中创建自定义小部件(我经常使用它),以及我希望在散景中工作的内容以及我收到的错误消息。
有没有其他方法可以在不使用 JavaScript 的情况下在散景中创建自定义小部件?具体来说,我正在尝试创建一个自定义滑块,每侧都有小的 - 和 + 按钮,可以将滑块递增/递减 1 步。我想在许多应用程序中使用此自定义小部件,因此我希望将其定义为自己的 class,并使用 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))
更新:我尝试创建的特定自定义小部件是一个滑块,两侧各有一个按钮(左侧标记为“-”,右侧标记为“+”),可将滑块值更改 1 步.这用于微调 Slider 的值,因此不需要鼠标准确地击中目标值。我通过链接默认的 Slider 和 Button 对象创建了这个自定义小部件,它在浏览器中呈现,但回调功能不起作用(特别是 Slider 'on_change' 方法)。
这个自定义小部件是否可以直接使用散景和 JS 实现?是否有在线参考可以提供提示而无需深入研究 JS。
Bokeh 是一个用于在现代浏览器(或嵌入式 HTML 小部件)中生成绘图和可视化应用程序的库。它由两个基本部分组成。 Bokeh 的 python 端实际上只是一个复杂的 "wrapper" 或 "binding",它最终会生成一个声明性 JSON 文档,进而驱动一个 JavaScript 库(BokehJS ) 实际上在浏览器中完成所有工作。
扩展 Bokeh 必然意味着提供等式的两边:您必须提供(通常非常小的)python 扩展声明,实际上只是指定自动生成 [=38] 所需的信息=] 我上面描述的格式。而且您还必须为扩展提供一个 JavaScript(或 TypeScript)实现,它实际上在浏览器中完成所有工作。
由于浏览器无法 运行 Python 代码,实现 必须 JavaScript.
Flexx 和 Brython 等库可以 "transpile" 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))