golang创建控制台用户界面的极简插件库gocui的使用
Golang创建控制台用户界面的极简插件库gocui的使用
GOCUI - Go控制台用户界面
Gocui是一个极简的Go包,旨在创建控制台用户界面。
特性
- 极简API
- 视图(界面中的"窗口")实现了io.ReadWriter接口
- 支持重叠视图
- 可以在运行时修改GUI(并发安全)
- 全局和视图级别的按键绑定
- 鼠标支持
- 彩色文本
- 可定制的编辑模式
- 易于构建可重用的小部件、复杂布局等
安装
执行以下命令安装:
go get github.com/jroimartin/gocui
文档
执行以下命令查看文档:
go doc github.com/jroimartin/gocui
示例
下面是一个简单的gocui使用示例:
package main
import (
"fmt"
"log"
"github.com/jroimartin/gocui"
)
func main() {
// 创建新的GUI实例
g, err := gocui.NewGui(gocui.OutputNormal)
if err != nil {
log.Panicln(err)
}
defer g.Close()
// 设置布局管理器函数
g.SetManagerFunc(layout)
// 设置Ctrl+C退出键绑定
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, "Hello world!")
}
return nil
}
// 退出函数
func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}
截图
更多关于golang创建控制台用户界面的极简插件库gocui的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang创建控制台用户界面的极简插件库gocui的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用gocui创建Golang控制台用户界面
gocui是一个轻量级的Go语言库,用于在终端中创建控制台用户界面(CUI)。它提供了创建视图、处理输入和布局管理的基本功能,非常适合需要简单交互式终端应用的场景。
安装gocui
go get github.com/jroimartin/gocui
基本使用示例
下面是一个简单的gocui应用示例,展示如何创建基本界面:
package 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 := keybindings(g); 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("side", 0, 0, maxX/4, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.Title = "菜单"
v.Highlight = true
v.SelBgColor = gocui.ColorGreen
v.SelFgColor = gocui.ColorBlack
fmt.Fprintln(v, "选项1")
fmt.Fprintln(v, "选项2")
fmt.Fprintln(v, "选项3")
}
// 创建主内容视图
if v, err := g.SetView("main", maxX/4+1, 0, maxX-1, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.Title = "内容"
v.Wrap = true
fmt.Fprintln(v, "欢迎使用控制台界面!")
}
return nil
}
func keybindings(g *gocui.Gui) error {
// 绑定Ctrl+C退出
if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil {
return err
}
// 绑定Tab键切换视图
if err := g.SetKeybinding("", gocui.KeyTab, gocui.ModNone, nextView); err != nil {
return err
}
return nil
}
func quit(g *gocui.Gui, v *gocui.View) error {
return gocui.ErrQuit
}
func nextView(g *gocui.Gui, v *gocui.View) error {
next := "main"
if v == nil || v.Name() == "main" {
next = "side"
}
if _, err := g.SetCurrentView(next); err != nil {
return err
}
return nil
}
核心概念
1. Gui对象
gocui.Gui
是核心对象,管理所有视图和输入处理。
2. 视图(View)
视图是终端中的矩形区域,可以显示内容和处理输入。
3. 布局管理
通过SetManagerFunc
设置布局函数,在窗口大小变化时自动调用。
4. 键盘绑定
使用SetKeybinding
方法绑定按键事件。
高级功能示例
1. 可编辑视图
func editableView(g *gocui.Gui, v *gocui.View) error {
v.Editable = true
v.Wrap = true
v.Title = "编辑区"
return nil
}
2. 鼠标支持
g.Mouse = true
// 绑定鼠标点击事件
if err := g.SetKeybinding("", gocui.MouseLeft, gocui.ModNone, mouseClick); err != nil {
return err
}
3. 颜色支持
v.BgColor = gocui.ColorBlue
v.FgColor = gocui.ColorYellow
实际应用示例:TODO列表
func todoLayout(g *gocui.Gui) error {
maxX, maxY := g.Size()
// 任务列表
if v, err := g.SetView("list", 0, 0, maxX/3, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.Title = "任务列表"
v.Highlight = true
fmt.Fprintln(v, "1. 学习gocui")
fmt.Fprintln(v, "2. 编写应用")
fmt.Fprintln(v, "3. 测试功能")
}
// 任务详情
if v, err := g.SetView("detail", maxX/3+1, 0, maxX-1, maxY/2); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.Title = "任务详情"
v.Wrap = true
fmt.Fprintln(v, "选择左侧任务查看详情")
}
// 输入框
if v, err := g.SetView("input", maxX/3+1, maxY/2+1, maxX-1, maxY-1); err != nil {
if err != gocui.ErrUnknownView {
return err
}
v.Title = "添加新任务"
v.Editable = true
}
return nil
}
优点与限制
优点:
- 轻量级,无外部依赖
- 简单易用的API
- 支持基本的颜色和布局
- 跨平台支持
限制:
- 不适合复杂的UI布局
- 缺少高级组件(如表格、树形视图等)
- 文档相对简单
gocui非常适合需要简单交互式终端应用的项目,对于更复杂的需求,可以考虑termui或tview等更全功能的库。