使用go語言的Console UI

go語言的GUI是一大短板操禀,至今沒有官方的跨平臺GUI常熙,第三方GUI庫雖然有一些喉磁,例如QT/GTK/wxWidget的綁定,但是跨平臺編譯還是麻煩涕癣。如果我們只是需要一個簡單的GUI哗蜈,那么可以使用Console UI,今天我推薦一個很不錯的Console UIgocui坠韩,經(jīng)本人試用距潘,沒有額外依賴關(guān)系,完全可以在linux平臺編譯win32程序同眯。

如何安裝

它的源代碼地址(包引用路徑)是:github.com/jroimartin/gocui绽昼。但是該程序的中文支持不好,顯示中文字符時會漏掉一半文字须蜗,因此我給它打了一個補(bǔ)丁硅确,因?yàn)樵撗a(bǔ)丁還未被合并到主線中,請從:github.com/rocket049/gocui或者https://gitee.com/rocket049/gocui.git下載源代碼明肮,然后復(fù)制到目錄:GOPATH/src/github.com/jroimartin/gocui菱农。

打了補(bǔ)丁的程序和原程序有2個區(qū)別:

  1. 可以正確顯示中文;
  2. 多了一個專門用于從編輯窗口讀入中文的函數(shù):(v *View) ReadEditor() []byte柿估,該函數(shù)用于還原輸入的中文語句循未。

如何使用

我就以一個簡單的輸入、顯示程序做一個例子:

//Try cjk patch. example of view.ReadEditor
package main

import (
    "fmt"
    "log"

    "github.com/jroimartin/gocui"
)
// 輸出窗口
func viewOutput(g *gocui.Gui, x0, y0, x1, y1 int) error {
    v, err := g.SetView("out", x0, y0, x1, y1)
    if err != nil {
        if err != gocui.ErrUnknownView {
            return err
        }
        v.Wrap = true
        v.Overwrite = false
        v.Autoscroll = true
        v.SelBgColor = gocui.ColorRed
        v.Title = "Messages"
    }
    return nil
}
// 輸入窗口(編輯器)
func viewInput(g *gocui.Gui, x0, y0, x1, y1 int) error {
    if v, err := g.SetView("main", x0, y0, x1, y1); err != nil {
        if err != gocui.ErrUnknownView {
            return err
        }
        v.Editable = true
        v.Wrap = true
        v.Overwrite = false
        if _, err := g.SetCurrentView("main"); err != nil {
            return err
        }
        fmt.Fprintf(v, "example,中文輸入示例的妖,按回車輸入绣檬。press ENTER to input。Ctrl-C 退出")
    }
    return nil
}
// 顯示輸出嫂粟、輸入窗口
func layout(g *gocui.Gui) error {
    maxX, maxY := g.Size()
    if err := viewOutput(g, 1, 1, maxX-1, maxY-4); err != nil {
        return err
    }
    if err := viewInput(g, 1, maxY-3, maxX-1, maxY-1); err != nil {
        return err
    }
    return nil
}
// 退出函數(shù)
func quit(g *gocui.Gui, v *gocui.View) error {
    return gocui.ErrQuit
}
func main() {
    g, err := gocui.NewGui(gocui.OutputNormal)
    if err != nil {
        //log.Panicln(err)
    }

    g.Cursor = true
    g.Mouse = false
    g.ASCII = false

    g.SetManagerFunc(layout)
    if err := g.SetKeybinding("main", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
        log.Panicln(err)
    }
    if err := g.SetKeybinding("main", gocui.KeyEnter, gocui.ModNone, updateInput); err != nil {
        log.Panicln(err)
    }
    if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
        log.Panicln(err)
    }
    g.Close()
}
//updateInput 當(dāng)按下ENTER鍵時調(diào)用娇未,把輸入的內(nèi)容復(fù)制到輸出窗口中
func updateInput(g *gocui.Gui, cv *gocui.View) error {
    v, err := g.View("out")
    if cv != nil && err == nil {
        var p = cv.ReadEditor()
        if p != nil {
            v.Write([]byte("你:"))
            v.Write(append(p, '\n'))
        }
        v.Autoscroll = true
    }
    l := len(cv.Buffer())
    cv.MoveCursor(0-l, 0, true)
    cv.Clear()
    return nil
}

效果如何

下面的圖片就是我用該程序做的的一個匿名聊天程序界面:

匿名聊天程序

匿名聊天程序的源代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市星虹,隨后出現(xiàn)的幾起案子零抬,更是在濱河造成了極大的恐慌,老刑警劉巖宽涌,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件平夜,死亡現(xiàn)場離奇詭異,居然都是意外死亡卸亮,警方通過查閱死者的電腦和手機(jī)忽妒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兼贸,“玉大人锰扶,你說我怎么就攤上這事∏奘埽” “怎么了坷牛?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長很澄。 經(jīng)常有香客問我京闰,道長,這世上最難降的妖魔是什么甩苛? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任蹂楣,我火速辦了婚禮,結(jié)果婚禮上讯蒲,老公的妹妹穿的比我還像新娘痊土。我一直安慰自己,他們只是感情好墨林,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布赁酝。 她就那樣靜靜地躺著,像睡著了一般旭等。 火紅的嫁衣襯著肌膚如雪酌呆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天搔耕,我揣著相機(jī)與錄音隙袁,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛菩收,可吹牛的內(nèi)容都是我干的梨睁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼娜饵,長吁一口氣:“原來是場噩夢啊……” “哼而姐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起划咐,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钧萍,沒想到半個月后褐缠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡风瘦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年队魏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片万搔。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡胡桨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞬雹,到底是詐尸還是另有隱情昧谊,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布酗捌,位于F島的核電站呢诬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胖缤。R本人自食惡果不足惜尚镰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哪廓。 院中可真熱鬧狗唉,春花似錦、人聲如沸涡真。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哆料。三九已至澳迫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剧劝,已是汗流浹背橄登。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拢锹。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓谣妻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卒稳。 傳聞我的和親對象是個殘疾皇子蹋半,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評論 25 707
  • 不知何時開始,習(xí)慣聽著劉筱磁性而又溫暖的聲音入睡充坑,一直到最后的那句减江,晚安,內(nèi)心深處那昔日尖銳的痛處捻爷,在這聲音里辈灼,得...
    冷冰瞳閱讀 116評論 0 0
  • 太難忘的人總是可以在每首慢歌響起, 每個天氣變換也榄, 每把雨傘撐開巡莹, 每杯牛奶溫?zé)幔?每對情侶相擁, 每盒橙汁喝完甜紫,...
    摩希閱讀 402評論 1 1
  • 楊柳依依桃花開降宅, 千里春風(fēng)笑殘雪。 姹紫嫣紅俏爭艷囚霸, 蜂嗡蝶舞采蜜忙腰根。
    愛你的人是我865432閱讀 259評論 0 4
  • 明天就要上班,好多事情紛紛擾擾拓型。
    金桔檸檬柚子茶閱讀 180評論 0 0