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. 最佳实践
- 性能优化:只更新需要变化的组件,避免全量渲染
- 响应式设计:监听Resize事件,动态调整布局
- 颜色使用:合理使用颜色增强可读性,但不要过度使用
- 错误处理:确保正确处理终端大小变化等边界情况
termui提供了丰富的组件和灵活的布局系统,非常适合开发各种终端监控工具和仪表盘应用。通过组合不同的组件和实时数据更新,你可以创建出功能强大且美观的终端界面。