go語言的GUI是一大短板操禀,至今沒有官方的跨平臺GUI常熙,第三方GUI庫雖然有一些喉磁,例如QT/GTK/wxWidget
的綁定,但是跨平臺編譯還是麻煩涕癣。如果我們只是需要一個簡單的GUI哗蜈,那么可以使用Console UI
,今天我推薦一個很不錯的Console UI
:gocui
坠韩,經(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ū)別:
- 可以正確顯示中文;
- 多了一個專門用于從編輯窗口讀入中文的函數(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
}
效果如何
下面的圖片就是我用該程序做的的一個匿名聊天程序界面: