使用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ǔ)丁,因為該補(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容