JSA通过ffi调用tcl/tk创建窗体等
创作者俱乐部成员
JSA很好用,但它创建的窗体有bug且不够灵活
fetch很好用,但它不完整,比如无法请求二进制文件
幸好wps提供了ffi,可以调用动态链接库
那么,在脚本环境里,跨平台,动态创建窗口哪家强?
tcl/tk虽然比较老,外观比较丑,但足够灵活简单,算是性价比高的选择
就比如python里的tkinter,就是嵌入了这个tk库
在linux里安装tcl之后,就可以在/usr/lib里找到libtcl.so
然后上代码:
| 📌 | function tt() { const tcl = ffi.LoadLibrary("libtcl.so", { Tcl_CreateInterp: { returnType: "pointer", parameters: []}, Tcl_DeleteInterp: { returnType: "void", parameters: ["pointer"]}, Tcl_Init: { returnType: "int32", parameters: ["pointer"] }, Tcl_Eval: { returnType: "int32", parameters: ["pointer", "string"]}, Tcl_GetStringResult: { returnType: "string", parameters: ["pointer"]}, }) const interp = tcl.Tcl_CreateInterp(); if (tcl.Tcl_Init(interp) !== 0) { throw new Error(tcl.Tcl_GetStringResult(interp)); } tcl.Tcl_Eval(interp, String.raw`package require Tk wm title . "Hello" wm geometry . 300x200 label .lbl -text "Hello TCL/Tk!" -font {Arial 20} pack .lbl -expand 1 button .btn -text "关闭" -command {destroy .} pack .btn -pady 10 tkwait window . return 123`) console.log(tcl.Tcl_GetStringResult(interp)) tcl.Tcl_DeleteInterp(interp) } |
就五个方法:
创建解释器
初始化,以保证可以加载http之类的包
执行脚本
获取结果
删除解释器
其中,tcl创建窗体的脚本,用ai写又快又好
另外,tcl发送http获取二进制结果,然后返回给宿主js也很方便
丑是丑了点,但就像python里的tkinter,简单用脚本实现个窗体有时候还是很方便的
@金山办公
创作者俱乐部成员