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

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

简介

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

示例演示

特性

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

安装

Go模块

不需要手动go get termui,Go会自动管理导入的依赖项。注意在import语句中需要包含/v3

Dep

使用Dep安装时,命令为dep ensure -add github.com/gizak/termui。注意使用Dep时import语句中需要包含/v3

Hello World示例

package main

import (
	"log"

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

func main() {
	// 初始化termui
	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) // 设置位置和大小(x0,y0,x1,y1)

	// 渲染小部件
	ui.Render(p)

	// 事件循环,等待键盘事件退出
	for e := range ui.PollEvents() {
		if e.Type == ui.KeyboardEvent {
			break
		}
	}
}

可用小部件

termui提供了多种小部件,包括:

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

可以通过go run _examples/{example}.go运行示例,或者使用make run-examples依次运行所有示例。

注意事项

由于维护者时间有限,项目的更新频率可能不一致。欢迎有兴趣的开发者参与维护。


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

1 回复

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


使用termui-blessed-contrib开发Golang终端仪表盘

termui-blessed-contrib是一个基于blessed和termui的Go语言终端仪表盘开发库,它提供了丰富的终端UI组件,可以创建漂亮的命令行界面和数据可视化仪表盘。

安装

首先安装必要的依赖:

go get github.com/gizak/termui/v3
go get github.com/guptarohit/blessed-contrib

基本使用示例

下面是一个简单的仪表盘示例,展示如何使用termui-blessed-contrib创建基本的终端界面:

package main

import (
	"time"

	"github.com/guptarohit/blessed-contrib/blessed"
	"github.com/guptarohit/blessed-contrib/contrib"
)

func main() {
	// 创建屏幕对象
	screen, err := blessed.NewScreen()
	if err != nil {
		panic(err)
	}
	defer screen.Fini()

	// 设置屏幕标题
	screen.SetTitle("Terminal Dashboard")

	// 创建网格布局
	grid := contrib.NewGrid(screen)
	grid.Set(12, 12, 0, 0)

	// 添加组件
	lineChart := contrib.NewLineChart()
	lineChart.BorderLabel = "CPU Usage"
	lineChart.Data = []float64{10, 20, 30, 40, 30, 20, 10}
	grid.AddItem(lineChart, 0, 0, 4, 4, 0, 0, true)

	gauge := contrib.NewGauge()
	gauge.BorderLabel = "Memory"
	gauge.Percent = 50
	grid.AddItem(gauge, 0, 4, 4, 4, 0, 0, true)

	// 渲染界面
	screen.Render()

	// 模拟数据更新
	go func() {
		for {
			time.Sleep(1 * time.Second)
			// 更新图表数据
			newData := append(lineChart.Data[1:], rand.Float64()*50)
			lineChart.Data = newData
			
			// 更新仪表盘
			gauge.Percent = (gauge.Percent + 10) % 100
			
			screen.Render()
		}
	}()

	// 等待退出
	screen.WaitForQuit()
}

主要组件介绍

1. 图表组件

// 折线图
lineChart := contrib.NewLineChart()
lineChart.BorderLabel = "Network Traffic"
lineChart.Data = []float64{1.2, 2.3, 3.4, 4.5}

// 柱状图
barChart := contrib.NewBarChart()
barChart.BorderLabel = "Requests"
barChart.Data = []float64{10, 20, 30, 40}
barChart.Labels = []string{"Mon", "Tue", "Wed", "Thu"}

// 饼图
pieChart := contrib.NewPieChart()
pieChart.BorderLabel = "Disk Usage"
pieChart.Data = []float64{30, 20, 50} // 百分比
pieChart.Labels = []string{"System", "Apps", "Media"}

2. 仪表和进度条

// 仪表盘
gauge := contrib.NewGauge()
gauge.BorderLabel = "CPU"
gauge.Percent = 75 // 百分比

// 进度条
progress := contrib.NewProgressBar()
progress.BorderLabel = "Download"
progress.Percent = 25

3. 表格和列表

// 表格
table := contrib.NewTable()
table.BorderLabel = "Processes"
table.Rows = [][]string{
	{"PID", "Name", "CPU%"},
	{"1234", "nginx", "2.5"},
	{"5678", "mysql", "15.2"},
}

// 列表
list := contrib.NewList()
list.BorderLabel = "Menu"
list.Items = []string{"Start", "Stop", "Restart", "Exit"}

4. 地图和热图

// 地图
mapChart := contrib.NewMap()
mapChart.BorderLabel = "Locations"
mapChart.Data = map[string]float64{
	"US": 100,
	"CN": 200,
	"JP": 50,
}

// 热图
heatMap := contrib.NewHeatMap()
heatMap.BorderLabel = "Activity"
heatMap.Data = [][]float64{
	{1, 2, 3},
	{4, 5, 6},
	{7, 8, 9},
}

高级功能

1. 事件处理

screen.SetKeyListener(func(key string) {
	switch key {
	case "q":
		screen.Quit()
	case "up":
		// 处理上键
	case "down":
		// 处理下键
	}
	screen.Render()
})

2. 自定义样式

lineChart := contrib.NewLineChart()
lineChart.BorderFg = blessed.ColorGreen
lineChart.LineColor = blessed.ColorCyan
lineChart.Style.Fg = blessed.ColorWhite

3. 多面板布局

grid := contrib.NewGrid(screen)
grid.Set(12, 12, 0, 0)

// 第一行:两个组件各占一半
grid.AddItem(lineChart, 0, 0, 6, 6, 0, 0, true)
grid.AddItem(barChart, 0, 6, 6, 6, 0, 0, true)

// 第二行:一个全宽组件
grid.AddItem(table, 6, 0, 6, 12, 0, 0, true)

实际应用示例:系统监控仪表盘

package main

import (
	"math/rand"
	"time"

	"github.com/guptarohit/blessed-contrib/blessed"
	"github.com/guptarohit/blessed-contrib/contrib"
)

func main() {
	screen, err := blessed.NewScreen()
	if err != nil {
		panic(err)
	}
	defer screen.Fini()

	screen.SetTitle("System Monitor")

	grid := contrib.NewGrid(screen)
	grid.Set(12, 12, 0, 0)

	// CPU 使用率图表
	cpuChart := contrib.NewLineChart()
	cpuChart.BorderLabel = "CPU Usage %"
	cpuChart.Data = make([]float64, 20)
	grid.AddItem(cpuChart, 0, 0, 4, 6, 0, 0, true)

	// 内存仪表盘
	memGauge := contrib.NewGauge()
	memGauge.BorderLabel = "Memory"
	grid.AddItem(memGauge, 0, 6, 2, 6, 0, 0, true)

	// 磁盘仪表盘
	diskGauge := contrib.NewGauge()
	diskGauge.BorderLabel = "Disk"
	grid.AddItem(diskGauge, 2, 6, 2, 6, 0, 0, true)

	// 进程表格
	procTable := contrib.NewTable()
	procTable.BorderLabel = "Top Processes"
	procTable.Rows = [][]string{
		{"PID", "Name", "CPU%", "MEM%"},
		{"1234", "nginx", "2.5", "1.2"},
		{"5678", "mysql", "15.2", "25.1"},
	}
	grid.AddItem(procTable, 4, 0, 8, 12, 0, 0, true)

	// 模拟数据更新
	go func() {
		for {
			time.Sleep(1 * time.Second)
			
			// 更新CPU图表
			newCpuData := append(cpuChart.Data[1:], rand.Float64()*100)
			cpuChart.Data = newCpuData
			
			// 更新内存和磁盘
			memGauge.Percent = (memGauge.Percent + rand.Intn(10)) % 100
			diskGauge.Percent = (diskGauge.Percent + rand.Intn(5)) % 100
			
			screen.Render()
		}
	}()

	screen.Render()
	screen.WaitForQuit()
}

总结

termui-blessed-contrib为Go开发者提供了创建功能丰富的终端仪表盘的强大工具。通过组合各种图表、仪表和表格组件,可以构建出适合系统监控、数据分析等场景的终端界面。其优势包括:

  1. 丰富的可视化组件
  2. 灵活的布局系统
  3. 简单易用的API
  4. 实时数据更新能力
  5. 跨平台支持

对于需要在终端展示数据的Go应用程序,termui-blessed-contrib是一个非常值得考虑的选择。

回到顶部