Gox語言中使用Sciter庫(kù)進(jìn)行GUI圖形界面編程-GX23.1

Sciter是非常優(yōu)秀的跨平臺(tái)GUI圖形界面編程庫(kù)词爬,只需附帶一個(gè)動(dòng)態(tài)鏈接庫(kù)文件如暖,就可以實(shí)現(xiàn)基于HTML/CSS/TiScript的圖形界面吏垮,并且已經(jīng)經(jīng)過很多公司和商用產(chǎn)品的實(shí)際檢驗(yàn),穩(wěn)定可靠。我們常見的包括TeamViewer惋鸥,Symantec猬腰,Vmware鸟废,Evernote,360等公司或產(chǎn)品據(jù)說都使用了Sciter來制作界面姑荷,可見Sciter相當(dāng)值得信賴盒延。

Sciter提供多種語言的綁定,Gox語言中鼠冕,通過Go語言(Golang)的綁定來使用Sciter添寺,具體文檔可以參考Go-Sciter。這也是Sciter官方推薦的Go語言綁定庫(kù)懈费。

在Gox語言的0.998a版本之后计露,可以用類似下面的代碼實(shí)現(xiàn)一個(gè)圖形界面的小計(jì)算器程序。

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()

程序運(yùn)行后界面類似下面截圖所示:

可以在其中文本框中輸入任意算式憎乙,然后點(diǎn)擊“Calculate!”按鈕進(jìn)行計(jì)算票罐,點(diǎn)擊“Close”按鈕退出程序。下面將代碼逐行解釋版本放出泞边,可以更好的理解一般Sciter與Gox結(jié)合的方式该押。

// 首先按Gox語言的規(guī)則,用短名稱引用github.com/scitersdk/go-sciter庫(kù)和它的window子庫(kù)
// 如果不使用簡(jiǎn)稱繁堡,則可以直接使用github_scitersdk_gosciter這樣的全稱來引用沈善,也是可以的,這樣無需在一開始聲明
sciter = github_scitersdk_gosciter
window = github_scitersdk_gosciter_window

// 這是默認(rèn)準(zhǔn)備加載的html文件內(nèi)容椭蹄,直接放在字符串里了
// 其中布局很簡(jiǎn)單闻牡,就是一個(gè)抬頭,一個(gè)文本框用于輸入算式绳矩,和兩個(gè)按鈕分別用于計(jì)算和退出程序
// 需要注意的是罩润,Sciter并不支持Javascript來做腳本編程,而是使用自己的TiScript翼馆,據(jù)說某些方面比Javascript功能更強(qiáng)割以,相當(dāng)于結(jié)合了JQuery的Javascript加強(qiáng)版吧
// 注意其中綁定兩個(gè)按鈕點(diǎn)擊函數(shù)的方法金度,以及TiScript中選擇器的用法
// 其中用到的view.prints函數(shù)則是綁定的后面注入的Go語言中編寫的函數(shù),這演示了如何在Sciter中調(diào)用Gox語言編寫的函數(shù)严沥,Gox語言與Sciter結(jié)合猜极,才能發(fā)揮最大的威力
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編程最好都保證在一個(gè)線程中執(zhí)行界面操作,因此用這句話鎖定線程
runtime.LockOSThread()

// 創(chuàng)建一個(gè)Sciter窗口
w, err := window.New(sciter.DefaultWindowCreateFlag, sciter.DefaultRect)

// 檢查消玄,有錯(cuò)誤則直接退出程序執(zhí)行
checkError(err)

// 設(shè)置一些必要的Sciter參數(shù)跟伏,例如允許eval函數(shù)等
w.SetOption(sciter.SCITER_SET_SCRIPT_RUNTIME_FEATURES, sciter.ALLOW_EVAL | sciter.ALLOW_SYSINFO)

// 在窗口中載入HTML文本,第二個(gè)參數(shù)可以設(shè)置基礎(chǔ)的URL
w.LoadHtml(htmlT, "")

// 設(shè)置窗口標(biāo)題欄文本
w.SetTitle("Calculator")

// 給Sciter注入prints函數(shù)翩瓜,在TiScript中使用view.prints來調(diào)用
w.DefineFunction("prints", func(args) {
    tk.Pl("%v", args[0].String())
    return sciter.NewValue("")
})

// 顯示Sciter窗口并執(zhí)行
w.Show()
w.Run()

Sciter完全支持HTML/HTML 5受扳,完整支持CSS 2.1和部分CSS 3,并且真正支持跨平臺(tái)兔跌,由于Gox語言也是跨平臺(tái)的勘高,所以上面的程序在Windows、Linux和MacOS中都可以直接執(zhí)行(注意各個(gè)平臺(tái)都要帶上Sciter的動(dòng)態(tài)鏈接庫(kù)坟桅,Windows下只需要將sciter.dll放在Gox主程序相同的目錄下即可华望,最新的Gox壓縮包中已經(jīng)包含了該dll文件,Linux和MacOS中相對(duì)復(fù)雜桦卒,請(qǐng)參考Go-Sciter的說明文檔立美,僅需依照前兩步將動(dòng)態(tài)鏈接庫(kù)文件設(shè)置好即可)。

在Gox語言中使用Sciter庫(kù)進(jìn)行GUI圖形界面編程方灾,主要的優(yōu)點(diǎn)在于:

  • 真正支持跨平臺(tái),Windows碌更、Linux和MacOS都是基本完美支持裕偿;而Gox中的LCL庫(kù)目前在Linux和Mac上還無法支持;
  • 支持虛擬機(jī)環(huán)境痛单,Giu庫(kù)則在虛擬機(jī)和云服務(wù)器上由于一般沒有OpenGL顯卡嘿棘,所以無法支持;而Sciter則完全沒有問題旭绒;
  • Sciter本身自帶的TiScript腳本語言鸟妙,已經(jīng)可以解決很多小問題了,本例中的計(jì)算功能既是由TiScript語言中的eval函數(shù)實(shí)現(xiàn)的挥吵。
  • Javascript語言不熟的開發(fā)者重父,或者更熟悉Go語言的開發(fā)者,可以選擇使用Go語言來完成相關(guān)的操作而無需通過TiScript忽匈,可以通過Gox語言實(shí)現(xiàn)基本上所有的DOM操作和其他功能房午,由于Gox語言與Go語言(Golang)具有特殊的血脈關(guān)系,所以也可以發(fā)揮Go語言的后臺(tái)處理的強(qiáng)項(xiàng)優(yōu)勢(shì)丹允。

另外郭厌,作為功能非常強(qiáng)大的GUI編程庫(kù)袋倔,建議一定要充分閱讀參考Sciter官方的文檔,才能實(shí)現(xiàn)更復(fù)雜的GUI圖形界面編程折柠。我們也會(huì)陸續(xù)推出相應(yīng)的文章進(jìn)行更詳細(xì)的介紹和示例宾娜。

注意,另外扇售,Ubuntu系統(tǒng)運(yùn)行Gox語言時(shí)需要事先安裝GTK3的環(huán)境碳默,執(zhí)行下述命令即可安裝:

apt install libgtk-3-dev

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缘眶,隨后出現(xiàn)的幾起案子嘱根,更是在濱河造成了極大的恐慌,老刑警劉巖巷懈,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件该抒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡顶燕,警方通過查閱死者的電腦和手機(jī)凑保,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涌攻,“玉大人欧引,你說我怎么就攤上這事】一眩” “怎么了芝此?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)因痛。 經(jīng)常有香客問我婚苹,道長(zhǎng),這世上最難降的妖魔是什么鸵膏? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任膊升,我火速辦了婚禮,結(jié)果婚禮上谭企,老公的妹妹穿的比我還像新娘廓译。我一直安慰自己,他們只是感情好债查,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布非区。 她就那樣靜靜地躺著,像睡著了一般攀操。 火紅的嫁衣襯著肌膚如雪院仿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音歹垫,去河邊找鬼剥汤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛排惨,可吹牛的內(nèi)容都是我干的吭敢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼暮芭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鹿驼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辕宏,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤畜晰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瑞筐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凄鼻,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年聚假,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了块蚌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膘格,死狀恐怖峭范,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘪贱,我是刑警寧澤纱控,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站政敢,受9級(jí)特大地震影響其徙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喷户,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望访锻。 院中可真熱鬧褪尝,春花似錦、人聲如沸期犬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龟虎。三九已至璃谨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佳吞。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工拱雏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人底扳。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓铸抑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親衷模。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹊汛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359