Gox語言利用內(nèi)置的Sciter庫琉苇,可以直接編寫圖形界面(GUI),運(yùn)行時(shí)僅需隨gox主程序附帶一個(gè)運(yùn)行庫文件(例如鸥拧,Windows下是名為sciter.dll的動(dòng)態(tài)運(yùn)行庫文件)瘤旨,該文件可以從Gox語言官網(wǎng)下載,或直接運(yùn)行g(shù)ox -initgui自動(dòng)下載颈墅。
本例就展示了一個(gè)麻雀雖小而又五臟俱全的GUI編程示例,包括了如何使用Sciter庫展示一個(gè)登錄對話框雾袱,然后獲取用戶輸入的信息后又彈出另一個(gè)對話框展示出來恤筛。下面話不多說直接上代碼,當(dāng)然其中有詳盡的注釋:
// 本例代碼完整演示了在Gox語言中如何使用Sciter包
// 來顯示一個(gè)圖形化(GUI)的登錄對話框
// 并獲得用戶輸入的信息供以后使用
// 主要知識點(diǎn)包括:
// 1芹橡、初始化圖形界面環(huán)境
// 2毒坛、使用HTML+TIScript來構(gòu)建對話框界面和界面操作
// 3、獲得屏幕大小并使對話框窗口居中的兩種方法
// 4林说、如何從對話框獲取用戶錄入的信息以便后續(xù)使用
// 5. Gox語言和Sciter方式的圖形界面如何互相調(diào)用其中的函數(shù)
// 并進(jìn)行參數(shù)傳遞
// 設(shè)定用到的Sciter包和screenshot包的簡稱
// 使用github.com/kbinani/screenshot包的原因是
// 使用其中的獲取屏幕分辨率的函數(shù)
// 這是第一種讓對話框居中的方法中用到的
sciter = github_scitersdk_gosciter
window = github_scitersdk_gosciter_window
screenshot = github_kbinani_screenshot
// Gox語言中使用圖形化界面(GUI)編程能力時(shí)
// 均需要調(diào)用initGUI()函數(shù)來進(jìn)行初始化
initGUI()
// Sciter的圖形界面編程煎殷,可以簡單地理解為
// 類似Electron等,用一個(gè)內(nèi)置的瀏覽器執(zhí)行
// HTML+CSS+JavaScript制作的網(wǎng)頁作為界面
// 只不過Sciter將JavaScript換成了類似的TIScript
// 下面的htmlT就是定義了用HTML+CSS+TIScript制作的
// 登錄對話框界面
// 具備JavaScript的知識的話腿箩,TIScript應(yīng)該很好理解
// TIScript已經(jīng)將類似JQuery的功能集成在其中了
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>請輸入用戶名和密碼登錄……</span>
</div>
<div style="margin-top: 10px; margin-bottom: 10px;">
<label for="userNameID" >用戶名: </label><input id="userNameID" type=text />
</div>
<div style="margin-top: 10px; margin-bottom: 10px;">
<label for="userNameID" >密碼: </label><input id="passwordID" type=password />
</div>
<div>
<button id="btnLoginID">登錄</button>
<button id="btnClose">關(guān)閉</button>
</div>
<script type="text/tiscript">
$(#btnLoginID).on("click", function() {
var userNameT = $(#userNameID).value.trim();
var passwordT = $(#passwordID).value.trim();
view.setResult(userNameT, passwordT);
view.close();
});
$(#btnClose).on("click", function() {
view.close();
});
</script>
</body>
</html>
`
// 鎖定圖形界面在當(dāng)前線程中豪直,以免出現(xiàn)異常
runtime.LockOSThread()
// 獲取當(dāng)前屏幕(第一塊屏幕)的分辨率及區(qū)域
// 返回結(jié)果類似 image.Rectangle{Min:image.Point{X:0, Y:0}, Max:image.Point{X:1920, Y:1080}}
// 其中Max中的X、Y可以分別理解為屏幕的寬和高
bounds := screenshot.GetDisplayBounds(0)
// 計(jì)算我們準(zhǔn)備展示的登錄框的尺寸和位置
// 對話框?qū)捀叻謩e為400*300珠移,然后根據(jù)屏幕尺寸
// 計(jì)算居中時(shí)對話框的x弓乙,y坐標(biāo)(左上角)
w = 400
h = 300
left = bounds.Max.X/2 - w/2
top = bounds.Max.Y/2 - h/2
// 按計(jì)算的結(jié)果創(chuàng)建對話框窗口
w, err := window.New(sciter.DefaultWindowCreateFlag, &sciter.Rect{Left: int32(left), Top: int32(top), Right: int32(left + w), Bottom: int32(top + h)})
// 如果創(chuàng)建錯(cuò)誤則中止代碼執(zhí)行
checkError(err)
// 加載前面設(shè)計(jì)的網(wǎng)頁界面
// 第二個(gè)參數(shù)可以設(shè)定一個(gè)網(wǎng)頁根路徑,
// 作為頁面中使用相對路徑的超級鏈接的根路徑
w.LoadHtml(htmlT, "")
// 設(shè)置窗口標(biāo)題
w.SetTitle("登錄窗口")
// 設(shè)置用于接收登錄框中用戶輸入信息的變量
userNameT = ""
passwordT = ""
// 定義準(zhǔn)備在TIScript調(diào)用的Gox語言函數(shù)
// setResult將把對話框中用戶輸入的
// 用戶名和密碼傳到變量userNameT和passwordT中
w.DefineFunction("setResult", func(args) {
// args是TIScript中調(diào)用setResult函數(shù)時(shí)傳入的參數(shù)
// 可以是多個(gè)钧惧,Gox中按位置索引進(jìn)行訪問
userNameT = args[0].String()
passwordT = args[1].String()
// 最后一定要返回一個(gè)值暇韧,空字符串也可以
return sciter.NewValue("")
})
// 將對話框顯示出來
w.Show()
// 開始運(yùn)行圖形界面,以便可以接受界面操作
w.Run()
// 此處第一個(gè)對話框已經(jīng)退出浓瞪,
// 輸出接收到的用戶輸入信息
pln("用戶名:", userNameT, ", 密碼:", passwordT)
// 在新建一個(gè)窗口懈玻,先使用默認(rèn)的位置和大小(將在屏幕左上方)
// 然后在對話框加載網(wǎng)頁是通過TIScript的代碼進(jìn)行位置和大小調(diào)整
w, err := window.New(sciter.DefaultWindowCreateFlag, sciter.DefaultRect)
checkError(err)
// 下面是新窗口的網(wǎng)頁內(nèi)容乾颁,其中id為mainSpanID的SPAN標(biāo)簽
// 演示了如何用插入字符串的方式直接將Gox語言中
// 所需傳遞的信息傳入Sciter界面
htmlT = `
<html>
<head>
</head>
<body>
<div>
<span id="mainSpanID">`+spr("用戶名:%v, 密碼:%v", userNameT, passwordT)+`</span>
</div>
</body>
<script type="text/tiscript">
function moveToCenter() {
var (w, h) = view.screenBox(#frame, #dimension)
view.move((w-480)/2, (h-200)/2, 480, 200);
return String.printf("%v|%v", w, h);
}
function self.ready() {
$(#mainSpanID).value = view.getText();
}
</script>
</html>
`
// 定義了getText函數(shù)演示以另一種方式傳入信息到Sciter界面
// 由于self.ready()函數(shù)將在Sciter網(wǎng)頁被加載后立即執(zhí)行
// 因此本對話框中顯示的信息應(yīng)該是密碼在前的
w.DefineFunction("getText", func(args) {
return sciter.NewValue(spr("密碼:%v, 用戶名:%v", passwordT, userNameT))
})
w.LoadHtml(htmlT, "")
w.SetTitle("結(jié)果")
// 在顯示對話框之前先調(diào)用TIScript定義的函數(shù)
// moveToCenter來將對話框的位置和大小改變
// 這次的大小是480*200
result, _ := w.Call("moveToCenter")
// moveToCenter函數(shù)還會(huì)返回Sciter中獲取到的
// 屏幕尺寸涂乌,我們將其展示出來
listT = strSplit(result.String(), "|")
pl("屏幕寬度:%v艺栈,屏幕高度: %v", listT[0], listT[1])
w.Show()
w.Run()
代碼中有詳細(xì)的解釋,可以看出骂倘,Gox語言制作GUI界面是非常方便的眼滤,也具有充足的(圖形界面與Gox語言代碼之間的)交互能力巴席。
代碼運(yùn)行的效果如下:
點(diǎn)擊登錄按鈕后:
把本段代碼中的screenshot包去掉(因?yàn)閮H在Windows下測試正常历涝,也許是因?yàn)檫h(yuǎn)程X窗口調(diào)用的關(guān)系),在Linux也可以正常運(yùn)行漾唉,效果如下:
如果需要查閱Sciter的開發(fā)文檔荧库,直接去Gox官網(wǎng)下載sciterTools.zip包,用其中的scapp工具查看doc子目錄下的main.html即是入口赵刑。包中也有Sciter界面的調(diào)試工具inspector分衫。
注意:
Gox語言是脫胎于Go語言(Golang)的開源腳本語言,解釋執(zhí)行般此,但相比Go語言更貼近高級語言蚪战,語法硬性限制也少一些;是一門偏向快速應(yīng)用的語言铐懊,也可以說是一個(gè)集成工具邀桑;
-
Gox語言主要優(yōu)勢有三點(diǎn):
- 第一,Gox語言本身只有一個(gè)可執(zhí)行文件科乎,綠色免配置壁畸,下載即可使用,無需安裝Go語言環(huán)境茅茂,無需編譯捏萍,非常適合快速制作原型以及云服務(wù)器上的遠(yuǎn)程開發(fā);
- 第二空闲,Gox中可以直接使用絕大多數(shù)Go語言標(biāo)準(zhǔn)庫中的對象和方法函數(shù)令杈,也內(nèi)置了很多常用、優(yōu)秀的第三方庫碴倾,充分發(fā)揮Go語言多年積累的資源優(yōu)勢逗噩;
- 第三,與很多其他主流語言不同影斑,Gox語言著力解決了GUI圖形界面編程的問題给赞,內(nèi)置了基于Sciter的圖形界面編程庫,直接可以進(jìn)行快捷高效的跨平臺(tái)圖形界面開發(fā)(Sciter只需下載一個(gè)動(dòng)態(tài)鏈接庫文件矫户,執(zhí)行和分發(fā)時(shí)附帶上即可片迅,放置在系統(tǒng)路徑中或者與Gox主程序相同目錄下即可),特別適合編寫演示原型系統(tǒng)皆辽,也經(jīng)歷了一些中小型系統(tǒng)的檢驗(yàn)柑蛇,尤其是作為輕量級的微服務(wù)后臺(tái)芥挣。
作為腳本語言,Gox語言性能肯定不如Go語言這樣的編譯型語言快耻台,但在大多數(shù)使用場景下性能也足夠用空免。并且,由于Gox語言與Go語言的緊密聯(lián)系盆耽,Gox語言編寫的腳本可以很容易的改寫成Go語言代碼蹋砚,編譯執(zhí)行后就可以發(fā)揮Go語言的速度優(yōu)勢了。因此摄杂,Gox語言也比較適合做初期的Go語言調(diào)試坝咐。
Gox的官網(wǎng)在這里,也可以在瀏覽器搜索引擎中直接搜索“gox語言”析恢,Github頁面在這里墨坚,在這里可以看到很多Gox語言的學(xué)習(xí)指南和實(shí)際應(yīng)用實(shí)例。