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
}

截图

r2cui

_examples/demo.go

_examples/dynamic.go


更多关于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等更全功能的库。

回到顶部