golang终端仪表盘开发插件库termui的使用

Golang终端仪表盘开发插件库termui的使用

termui是一个跨平台且完全可定制的终端仪表盘和widget库,基于termbox-go构建。它受到blessed-contrib和tui-rs的启发,完全用Go语言编写。

功能特性

  • 提供多种常见用途的预置widget
  • 可以轻松创建自定义widget
  • 支持相对网格或绝对坐标定位widget
  • 支持键盘、鼠标和终端大小调整事件
  • 支持颜色和样式设置

安装

使用Go模块时,不需要手动go get termui,Go会自动管理导入的依赖项。注意在导入语句中需要包含/v3,如下面的"Hello World"示例所示。

Hello World示例

package main

import (
	"log"

	ui "github.com/gizak/termui/v3"
	"github.com/gizak/termui/v3/widgets"
)

func main() {
	if err := ui.Init(); err != nil {
		log.Fatalf("failed to initialize termui: %v", err)
	}
	defer ui.Close()

	p := widgets.NewParagraph()
	p.Text = "Hello World!"
	p.SetRect(0, 0, 25, 5)

	ui.Render(p)

	for e := range ui.PollEvents() {
		if e.Type == ui.KeyboardEvent {
			break
		}
	}
}

可用Widget

termui提供多种widget供开发使用:

  • BarChart(条形图)
  • Canvas(用于绘制点阵图)
  • Gauge(仪表)
  • Image(图像)
  • List(列表)
  • Tree(树形结构)
  • Paragraph(段落)
  • PieChart(饼图)
  • Plot(用于散点图和折线图)
  • Sparkline(迷你图)
  • StackedBarChart(堆叠条形图)
  • Table(表格)
  • Tabs(标签页)

更复杂示例:仪表盘

下面是一个包含多个widget的仪表盘示例:

package main

import (
	"log"
	"math"
	"time"

	ui "github.com/gizak/termui/v3"
	"github.com/gizak/termui/v3/widgets"
)

func main() {
	if err := ui.Init(); err != nil {
		log.Fatalf("failed to initialize termui: %v", err)
	}
	defer ui.Close()

	// 创建段落widget
	p := widgets.NewParagraph()
	p.Title = "系统信息"
	p.Text = "这是一个终端仪表盘示例\n按q键退出"
	p.SetRect(0, 0, 50, 5)
	p.TextStyle.Fg = ui.ColorWhite
	p.BorderStyle.Fg = ui.ColorCyan

	// 创建仪表widget
	g := widgets.NewGauge()
	g.Title = "CPU使用率"
	g.Percent = 50
	g.SetRect(0, 5, 50, 10)
	g.BarColor = ui.ColorRed
	g.BorderStyle.Fg = ui.ColorWhite
	g.TitleStyle.Fg = ui.ColorCyan

	// 创建条形图widget
	bc := widgets.NewBarChart()
	bc.Title = "内存使用 (MB)"
	bc.Data = []float64{3, 2, 5, 3, 9, 5, 4}
	bc.Labels = []string{"S1", "S2", "S3", "S4", "S5", "S6", "S7"}
	bc.SetRect(0, 10, 50, 20)
	bc.BarWidth = 5
	bc.BarColors = []ui.Color{ui.ColorGreen, ui.ColorYellow}
	bc.LabelStyles = []ui.Style{ui.NewStyle(ui.ColorBlue)}
	bc.NumStyles = []ui.Style{ui.NewStyle(ui.ColorBlack)}

	// 渲染所有widget
	ui.Render(p, g, bc)

	// 更新数据
	ticker := time.NewTicker(time.Second).C
	update := func() {
		g.Percent = (g.Percent + 5) % 100
		for i := range bc.Data {
			bc.Data[i] = math.Sin(float64(time.Now().UnixNano())/1e10+float64(i)*0.5) * 5 + 5
		}
		ui.Render(p, g, bc)
	}

	// 事件处理
	uiEvents := ui.PollEvents()
	for {
		select {
		case e := <-uiEvents:
			switch e.ID {
			case "q", "<C-c>":
				return
			}
		case <-ticker:
			update()
		}
	}
}

注意事项

termui目前兼容Go 1.15及以上版本。由于项目维护者时间有限,更新频率可能不一致。欢迎有兴趣的开发者参与维护。


更多关于golang终端仪表盘开发插件库termui的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang终端仪表盘开发插件库termui的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang终端仪表盘开发:termui库使用指南

termui是一个强大的Go语言终端仪表盘开发库,它允许开发者创建丰富的终端用户界面和实时数据可视化。下面我将详细介绍如何使用termui库来构建终端仪表盘。

1. termui安装与基本设置

首先安装termui库:

go get github.com/gizak/termui/v3

基本初始化代码:

package main

import (
	"log"
	"github.com/gizak/termui/v3"
)

func main() {
	if err := termui.Init(); err != nil {
		log.Fatalf("failed to initialize termui: %v", err)
	}
	defer termui.Close()
	
	// 在这里构建你的UI
}

2. 基本组件使用

2.1 文本段落(Paragraph)

p := termui.NewParagraph()
p.Title = "系统状态"
p.Text = "CPU使用率: 25%\n内存使用: 3.2G/8G"
p.SetRect(0, 0, 50, 5)
p.TextStyle.Fg = termui.ColorWhite
p.BorderStyle.Fg = termui.ColorCyan

termui.Render(p)

2.2 列表(List)

list := termui.NewList()
list.Title = "服务列表"
list.Rows = []string{
	"[1] Nginx (运行中)",
	"[2] MySQL (运行中)",
	"[3] Redis (停止)",
}
list.TextStyle.Fg = termui.ColorYellow
list.WrapText = false
list.SetRect(0, 6, 25, 12)

termui.Render(list)

2.3 表格(Table)

table := termui.NewTable()
table.Title = "进程监控"
table.Rows = [][]string{
	[]string{"PID", "名称", "CPU%", "内存"},
	[]string{"1234", "nginx", "2.5", "120M"},
	[]string{"5678", "mysql", "15.2", "1.2G"},
}
table.TextStyle = termui.NewStyle(termui.ColorWhite)
table.SetRect(26, 6, 75, 12)

termui.Render(table)

3. 数据可视化组件

3.1 柱状图(BarChart)

bc := termui.NewBarChart()
bc.Title = "CPU核心使用率"
bc.Data = []float64{25, 50, 75, 30, 60, 90, 15}
bc.Labels = []string{"Core1", "Core2", "Core3", "Core4", "Core5", "Core6", "Core7"}
bc.SetRect(0, 13, 50, 20)
bc.BarWidth = 5
bc.BarColors = []termui.Color{termui.ColorRed, termui.ColorGreen}
bc.LabelStyles = []termui.Style{termui.NewStyle(termui.ColorBlue)}

termui.Render(bc)

3.2 折线图(LineChart)

lc := termui.NewLineChart()
lc.Title = "网络流量 (MB/s)"
lc.Data = []float64{1.2, 2.5, 3.1, 4.8, 2.9, 3.6, 1.8}
lc.SetRect(51, 13, 75, 20)
lc.AxesColor = termui.ColorWhite
lc.LineColor = termui.ColorGreen

termui.Render(lc)

3.3 仪表盘(Gauge)

g := termui.NewGauge()
g.Title = "磁盘使用率"
g.Percent = 65
g.SetRect(0, 21, 50, 24)
g.BarColor = termui.ColorRed
g.BorderStyle.Fg = termui.ColorWhite
g.TitleStyle.Fg = termui.ColorCyan

termui.Render(g)

4. 布局管理

termui提供了Grid布局系统来管理组件位置:

import "github.com/gizak/termui/v3/widgets"

func main() {
	// ...初始化代码...
	
	// 创建组件
	p := widgets.NewParagraph()
	p.Title = "系统概览"
	p.Text = "欢迎使用系统监控面板"
	
	lc := widgets.NewPlot()
	lc.Title = "CPU使用率"
	lc.Data = [][]float64{{1, 2, 3, 4, 5}}
	
	// 创建网格布局
	grid := termui.NewGrid()
	termWidth, termHeight := termui.TerminalDimensions()
	grid.SetRect(0, 0, termWidth, termHeight)
	
	// 定义布局
	grid.Set(
		termui.NewRow(1.0/3,
			termui.NewCol(1.0/2, p),
			termui.NewCol(1.0/2, lc),
		),
	)
	
	termui.Render(grid)
}

5. 事件处理与实时更新

// 设置定时器更新数据
uiEvents := termui.PollEvents()
ticker := time.NewTicker(time.Second).C

for {
	select {
	case e := <-uiEvents:
		switch e.ID {
		case "q", "<C-c>":
			return
		case "<Resize>":
			payload := e.Payload.(termui.Resize)
			termWidth, termHeight = payload.Width, payload.Height
			grid.SetRect(0, 0, termWidth, termHeight)
			termui.Clear()
			termui.Render(grid)
		}
	case <-ticker:
		// 更新数据
		lc.Data = append(lc.Data[1:], rand.Float64()*10)
		termui.Render(grid)
	}
}

6. 完整示例

下面是一个完整的终端仪表盘示例:

package main

import (
	"log"
	"math/rand"
	"time"
	
	"github.com/gizak/termui/v3"
	"github.com/gizak/termui/v3/widgets"
)

func main() {
	if err := termui.Init(); err != nil {
		log.Fatalf("failed to initialize termui: %v", err)
	}
	defer termui.Close()
	
	// 创建组件
	p := widgets.NewParagraph()
	p.Title = "系统监控"
	p.Text = "最后更新: " + time.Now().Format("15:04:05")
	p.SetRect(0, 0, 50, 3)
	
	// CPU使用率图表
	lc := widgets.NewPlot()
	lc.Title = "CPU使用率 (%)"
	lc.Data = make([][]float64, 1)
	lc.Data[0] = make([]float64, 50)
	lc.SetRect(0, 3, 50, 15)
	
	// 内存使用仪表盘
	g := widgets.NewGauge()
	g.Title = "内存使用"
	g.Percent = 40
	g.SetRect(0, 15, 50, 18)
	
	// 进程列表
	list := widgets.NewList()
	list.Title = "运行中的进程"
	list.Rows = []string{
		"[1] nginx",
		"[2] mysql",
		"[3] redis",
	}
	list.SetRect(50, 0, 75, 10)
	
	// 网络流量图表
	bc := widgets.NewBarChart()
	bc.Title = "网络流量 (MB/s)"
	bc.Data = []float64{1.2, 2.5, 3.1}
	bc.Labels = []string{"eth0", "eth1", "lo"}
	bc.SetRect(50, 10, 75, 18)
	
	// 渲染所有组件
	termui.Render(p, lc, g, list, bc)
	
	// 事件循环
	uiEvents := termui.PollEvents()
	ticker := time.NewTicker(time.Second).C
	for {
		select {
		case e := <-uiEvents:
			switch e.ID {
			case "q", "<C-c>":
				return
			}
		case <-ticker:
			// 更新数据
			p.Text = "最后更新: " + time.Now().Format("15:04:05")
			lc.Data[0] = append(lc.Data[0][1:], rand.Float64()*100)
			g.Percent = (g.Percent + 5) % 100
			
			termui.Render(p, lc, g, list, bc)
		}
	}
}

7. 最佳实践

  1. 性能优化:只更新需要变化的组件,避免全量渲染
  2. 响应式设计:监听Resize事件,动态调整布局
  3. 颜色使用:合理使用颜色增强可读性,但不要过度使用
  4. 错误处理:确保正确处理终端大小变化等边界情况

termui提供了丰富的组件和灵活的布局系统,非常适合开发各种终端监控工具和仪表盘应用。通过组合不同的组件和实时数据更新,你可以创建出功能强大且美观的终端界面。

回到顶部