Gox語言例4:圖形化界面(GUI)的登錄對話框

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)行的效果如下:

image.png

點(diǎn)擊登錄按鈕后:

image.png

把本段代碼中的screenshot包去掉(因?yàn)閮H在Windows下測試正常历涝,也許是因?yàn)檫h(yuǎn)程X窗口調(diào)用的關(guān)系),在Linux也可以正常運(yùn)行漾唉,效果如下:

image.png

如果需要查閱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í)例。

如果人生是一場旅行映挂,我愿沿途播撒花朵泽篮。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柑船,隨后出現(xiàn)的幾起案子帽撑,更是在濱河造成了極大的恐慌,老刑警劉巖椎组,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油狂,死亡現(xiàn)場離奇詭異,居然都是意外死亡寸癌,警方通過查閱死者的電腦和手機(jī)专筷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒸苇,“玉大人磷蛹,你說我怎么就攤上這事∠荆” “怎么了味咳?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長檬嘀。 經(jīng)常有香客問我槽驶,道長,這世上最難降的妖魔是什么鸳兽? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任掂铐,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘全陨。我一直安慰自己鹿蜀,他們只是感情好凌节,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赫粥,像睡著了一般圾另。 火紅的嫁衣襯著肌膚如雪侥猬。 梳的紋絲不亂的頭發(fā)上碧浊,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天赶么,我揣著相機(jī)與錄音,去河邊找鬼镜悉。 笑死祟辟,一個(gè)胖子當(dāng)著我的面吹牛医瘫,可吹牛的內(nèi)容都是我干的侣肄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼醇份,長吁一口氣:“原來是場噩夢啊……” “哼稼锅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起僚纷,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤矩距,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后怖竭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锥债,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年痊臭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哮肚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡广匙,死狀恐怖允趟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸦致,我是刑警寧澤潮剪,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站分唾,受9級特大地震影響抗碰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绽乔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一弧蝇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦捍壤、人聲如沸骤视。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽专酗。三九已至,卻和暖如春盗扇,著一層夾襖步出監(jiān)牢的瞬間祷肯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工疗隶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佑笋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓斑鼻,卻偏偏與公主長得像蒋纬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子坚弱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容