
GOCUI是一个专为Go语言设计的极简主义控制台用户界面(Console User Interface)库。它的设计理念是简单易用,允许开发者创建出富有交互性的控制台应用程序,包括重叠窗口、全局和局部的键绑定以及鼠标支持等功能。
GOCUI的核心在于其直观的API设计。视图(views),即GUI中的“窗口”,实现了io.ReadWriter接口,这意味着你可以直接对它们进行读写操作。此外,它支持在运行时安全地修改GUI布局,这使得动态更新用户界面变得轻而易举。同时,该库还允许自定义编辑模式,方便构建可复用的组件和复杂的布局。
GOCUI可以广泛应用于各种控制台应用中,如:
$ go get github.com/jroimartin/gocuipackage main
import (
"fmt"
"log"
"github.com/jroimartin/gocui"
)
func main() {
g, err := gocui.NewGui(gocui.OutputNormal)
if err != nil {
log.Panicln(err)
}
defer g.Close()
g.SetManagerFunc(layout)
if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
log.Panicln(err)
}
if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
log.Panicln(err)
}
}
func layout(g *gocui.Gui) error {
maxX, maxY := g.Size()
if v, err := g.SetView("hello", maxX/2-7, maxY/2, maxX/2+7, maxY/2+2); err != nil {
if err != gocui.ErrUnknownView {
return err
}
fmt.Fprintln(v, "你好,世界!")
}
return nil
}
func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}


gocui 的中文支持不好,显示中文字符时会漏掉一半文字,因此我给它打了一个补丁,因为该补丁还未被合并到主线中,请从:github.com/rocket049/gocui 或者 https://gitee.com/rocket049/gocui.git 下载源代码,然后复制到目录:GOPATH/src/github.com/jroimartin/gocui。
打了补丁的程序和原程序有2个区别:
我就以一个简单的输入、显示程序做一个例子:
//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
}
// 退出函数
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 当按下ENTER键时调用,把输入的内容复制到输出窗口中
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
}下面的图片就是我用该程序做的的一个匿名聊天程序界面:
匿名聊天程序
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。