基于labview的控件句柄_Bokeh开发基于Js的独立App

b96984fe8ab8c8c6a989605b8c9cc33f.png

上一篇讲过如何基于Bokeh创建交互性Server App:

了凡春秋:基于Bokeh的交互性Server App​zhuanlan.zhihu.com
58f575835f87db6fc00e7d77030f5220.png

Server App有个问题就是程序运行时要保持bokeh server的存在,就是Python代码一直运行在后台。能不能创建独立的交互性App呢?答案是肯定的,方法是借助CustomJS,其本质是将交互性操作使用js代码实现,从而脱离Python的束缚。

想象一下,你用Bokeh开发了一个交互式网页App,将生成的html发给别人,他就可以在自己电脑上独立运行,而不需要安装Python、Bokeh,完美!

下面简单介绍一下Bokeh CustomJS的使用方法。

简单示例

47a828744a5a0874372527c78ac8e9de.gif
from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_file, show

# 构造数据
x = [x*0.005 for x in range(0, 200)]
y = x
source = ColumnDataSource(data=dict(x=x, y=y))

# 绘图
plot = Figure()
plot.line('x', 'y', source=source)

# 添加控件
jscode = """
    var data = source.data;
    var f = cb_obj.value
    var x = data['x']
    var y = data['y']
    for (var i = 0; i < x.length; i++) {
        y[i] = Math.pow(x[i], f)
    }
    source.change.emit();
"""
callback = CustomJS(args=dict(source=source), code=jscode)
slider = Slider(start=0.1, end=4, value=1, step=.1, title="阶次")
slider.js_on_change('value', callback)
layout = column(slider, plot)

# 保存和显示
output_file("js_on_change.html")
show(layout)

代码说明:

  • 通过js_on_change设置CustomJS类型的回调函数,实现将js代码注入html;
  • 驱动数据通过args注入,js中直接使用source访问数据;
  • cb_obj为触发响应的控件句柄,已隐式注入js,在js中直接使用。

运行程序,生成js_on_change.html,发给任何人都可以独立使用,而不依赖Python和Bokeh。

去除Js编程

如果你不想编Js代码,可以用Python实现,然后让Bokeh用PScript将Python代码转为Js。这种方式只能在Bokeh2.0之前使用,2.0以后会去掉这种方式,因为官方推荐用Js。

另外PScript是Flexx的一个模块,Flexx是用于创建图形用户界面(GUI)的纯Python工具箱,基于Web技术进行渲染,所以能创建桌面应用程序和web应用程序,同时可以将程序导出到独立的HTML文档中。Flexx貌似和Bokeh达到的效果一样,不过比较小众。

from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_file, show

# 构造数据
x = [x*0.005 for x in range(0, 200)]
y = x
source = ColumnDataSource(data=dict(x=x, y=y))

# 绘图
plot = Figure()
plot.line('x', 'y', source=source)

# 添加控件
def callback(source=source, window=None):
    data = source.data
    f = cb_obj.value
    x, y = data['x'], data['y']
    for i in range(len(x)):
        y[i] = window.Math.pow(x[i], f)
    source.change.emit()
slider = Slider(start=0.1, end=4, value=1, step=.1, title="阶次",
                callback=CustomJS.from_py_func(callback))
layout = column(slider, plot)

# 保存和显示
output_file("js_on_change1.html")
show(layout)

使用前,需要安装pscript:

conda install -c conda-forge pscript

pip install pscript

上面代码的效果和简单示例效果一样。

更多用法

更多用法可以参考官方文档

JavaScript Callbacks​docs.bokeh.org

画框工具

a87e233ba617ef2218bddaf2c9e4f1da.gif

在Js中响应各种用户交互事件

da293b0bad93bba8247be9e6e8d930fe.gif

数据选择

0939e65df2092bc1cbc122f5a30445ac.gif
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数功能 在窗口列表中寻找与指定条件相符的第一个子窗口 。 该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。 参数; (1)hwndParent:要查找的子窗口所在的父窗口的句柄(如果设置了hwndParent,则表示从这个hwndParent指向的父窗口中搜索子窗口)。 如果hwndParent为 0 ,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。 Windows NT5.0 and later:如果hwndParent是HWND_MESSAGE,函数仅查找所有消息窗口。 (2)hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndParent窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。 (3)lpszClass:指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位,必须位于lpClassName的低16位,高位必须为0。 (4)lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。 返回值 Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError 如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL。 若想获得更多错误信息,请调用GetLastError函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值