Gox语言中使用Sciter库进行GUI图形界面编程-GX23.1

Sciter是非常优秀的跨平台GUI图形界面编程库,只需附带一个动态链接库文件,就可以实现基于HTML/CSS/TiScript的图形界面,并且已经经过很多公司和商用产品的实际检验,稳定可靠。我们常见的包括TeamViewer,Symantec,Vmware,Evernote,360等公司或产品据说都使用了Sciter来制作界面,可见Sciter相当值得信赖。

Sciter提供多种语言的绑定,Gox语言中,通过Go语言(Golang)的绑定来使用Sciter,具体文档可以参考Go-Sciter。这也是Sciter官方推荐的Go语言绑定库。

在Gox语言的0.998a版本之后,可以用类似下面的代码实现一个图形界面的小计算器程序。

sciter = github_scitersdk_gosciter
window = github_scitersdk_gosciter_window

htmlT := `
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Calculator</title>
</head>
<body>
    <div style="margin-top: 10px; margin-bottom: 10px;">
        <span>Please enter the expression:</span>
    </div>
    <div style="margin-top: 10px; margin-bottom: 10px;">
        <input id="mainInputID" type=text />
    </div>
    <div>
        <button id="btnCal">Calculate!</button>
        <button id="btnClose">Close</button>
    </div>

    <script type="text/tiscript">
        $(#btnCal).on("click", function() {
            var result = eval($(#mainInputID).value);

            view.prints(String.printf("%v", result));

            $(#mainInputID).value = result;
        });
 
        $(#btnClose).on("click", function() {
            view.close();
        });
 
    </script>
</body>
</html>

`

runtime.LockOSThread()

w, err := window.New(sciter.DefaultWindowCreateFlag, sciter.DefaultRect)

checkError(err)

w.SetOption(sciter.SCITER_SET_SCRIPT_RUNTIME_FEATURES, sciter.ALLOW_EVAL | sciter.ALLOW_SYSINFO)

w.LoadHtml(htmlT, "")

w.SetTitle("Calculator")

w.DefineFunction("prints", func(args) {
    tk.Pl("%v", args[0].String())
    return sciter.NewValue("")
})

w.Show()

w.Run()

程序运行后界面类似下面截图所示:

可以在其中文本框中输入任意算式,然后点击“Calculate!”按钮进行计算,点击“Close”按钮退出程序。下面将代码逐行解释版本放出,可以更好的理解一般Sciter与Gox结合的方式。

// 首先按Gox语言的规则,用短名称引用github.com/scitersdk/go-sciter库和它的window子库
// 如果不使用简称,则可以直接使用github_scitersdk_gosciter这样的全称来引用,也是可以的,这样无需在一开始声明
sciter = github_scitersdk_gosciter
window = github_scitersdk_gosciter_window

// 这是默认准备加载的html文件内容,直接放在字符串里了
// 其中布局很简单,就是一个抬头,一个文本框用于输入算式,和两个按钮分别用于计算和退出程序
// 需要注意的是,Sciter并不支持Javascript来做脚本编程,而是使用自己的TiScript,据说某些方面比Javascript功能更强,相当于结合了JQuery的Javascript加强版吧
// 注意其中绑定两个按钮点击函数的方法,以及TiScript中选择器的用法
// 其中用到的view.prints函数则是绑定的后面注入的Go语言中编写的函数,这演示了如何在Sciter中调用Gox语言编写的函数,Gox语言与Sciter结合,才能发挥最大的威力
htmlT := `
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Calculator</title>
</head>
<body>
    <div style="margin-top: 10px; margin-bottom: 10px;">
        <span>Please enter the expression:</span>
    </div>
    <div style="margin-top: 10px; margin-bottom: 10px;">
        <input id="mainInputID" type=text />
    </div>
    <div>
        <button id="btnCal">Calculate!</button>
        <button id="btnClose">Close</button>
    </div>

    <script type="text/tiscript">
        $(#btnCal).on("click", function() {
            var result = eval($(#mainInputID).value);

            view.prints(String.printf("%v", result));

            $(#mainInputID).value = result;
        });
 
        $(#btnClose).on("click", function() {
            view.close();
        });
 
    </script>
</body>
</html>

`

// 由于所有GUI编程最好都保证在一个线程中执行界面操作,因此用这句话锁定线程
runtime.LockOSThread()

// 创建一个Sciter窗口
w, err := window.New(sciter.DefaultWindowCreateFlag, sciter.DefaultRect)

// 检查,有错误则直接退出程序执行
checkError(err)

// 设置一些必要的Sciter参数,例如允许eval函数等
w.SetOption(sciter.SCITER_SET_SCRIPT_RUNTIME_FEATURES, sciter.ALLOW_EVAL | sciter.ALLOW_SYSINFO)

// 在窗口中载入HTML文本,第二个参数可以设置基础的URL
w.LoadHtml(htmlT, "")

// 设置窗口标题栏文本
w.SetTitle("Calculator")

// 给Sciter注入prints函数,在TiScript中使用view.prints来调用
w.DefineFunction("prints", func(args) {
    tk.Pl("%v", args[0].String())
    return sciter.NewValue("")
})

// 显示Sciter窗口并执行
w.Show()
w.Run()

Sciter完全支持HTML/HTML 5,完整支持CSS 2.1和部分CSS 3,并且真正支持跨平台,由于Gox语言也是跨平台的,所以上面的程序在Windows、Linux和MacOS中都可以直接执行(注意各个平台都要带上Sciter的动态链接库,Windows下只需要将sciter.dll放在Gox主程序相同的目录下即可,最新的Gox压缩包中已经包含了该dll文件,Linux和MacOS中相对复杂,请参考Go-Sciter的说明文档,仅需依照前两步将动态链接库文件设置好即可)。

在Gox语言中使用Sciter库进行GUI图形界面编程,主要的优点在于:

  • 真正支持跨平台,Windows、Linux和MacOS都是基本完美支持;而Gox中的LCL库目前在Linux和Mac上还无法支持;
  • 支持虚拟机环境,Giu库则在虚拟机和云服务器上由于一般没有OpenGL显卡,所以无法支持;而Sciter则完全没有问题;
  • Sciter本身自带的TiScript脚本语言,已经可以解决很多小问题了,本例中的计算功能既是由TiScript语言中的eval函数实现的。
  • Javascript语言不熟的开发者,或者更熟悉Go语言的开发者,可以选择使用Go语言来完成相关的操作而无需通过TiScript,可以通过Gox语言实现基本上所有的DOM操作和其他功能,由于Gox语言与Go语言(Golang)具有特殊的血脉关系,所以也可以发挥Go语言的后台处理的强项优势。

另外,作为功能非常强大的GUI编程库,建议一定要充分阅读参考Sciter官方的文档,才能实现更复杂的GUI图形界面编程。我们也会陆续推出相应的文章进行更详细的介绍和示例。

注意,另外,Ubuntu系统运行Gox语言时需要事先安装GTK3的环境,执行下述命令即可安装:

apt install libgtk-3-dev

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266