JSA通过ffi调用tcl/tk创建窗体等

wils
wils

创作者俱乐部成员

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,简单用脚本实现个窗体有时候还是很方便的

海南省
浏览 59
收藏
2
分享
2 +1
4
+1
全部评论 4
 
覃欢
覃欢

@金山办公

窗体的BUG是什么,详细描述一下看看
· 广东省
回复
wils
wils

创作者俱乐部成员

试了下原来的一些bug,比如文本框换行等都修复了,赞赞赞 又试了下最近的,比如这个https://bbs.wps.cn/topic/82480,我也出现按两次窗体就不再弹出的问题 然后label的垂直向上对齐,如果和文本框放一行会很奇怪 label可以wrap,但手动无法换行 文本框现在可以换行了,但如果给的高度不够,会多出个滚动条,让人误解成数值调节按钮,但没有它又不太好,没法设置。。。 好像还有一些类似的鸡毛蒜皮的小事 关键是不知道jsa里的窗体能否通过UserForm1.Controls.Add动态添加控件,该怎么写这种? 之所以这篇帖子推荐tcl/tk,以前推荐windows里的ahkdll,主要是因为这两者都比较细致,虽然达不到html那么丰富的效果,但控件的属性比jsa要丰富很多,另外最重要的就是这两者可以非常方便的用代码添加控件
· 海南省
回复