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

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

Termdash是一个跨平台可定制的基于终端的仪表盘库,功能集受到gizak/termui项目的启发。

安装

安装Termdash库:

go get -u github.com/mum4k/termdash
cd github.com/mum4k/termdash

功能特性

  • 全面支持终端窗口调整大小
  • 可自定义布局、小部件放置、边框、边距、填充、颜色等
  • 运行时动态布局更改
  • 支持二叉树和网格形式的布局设置
  • 可聚焦的容器和小部件
  • 处理键盘和鼠标事件
  • 定期和事件驱动的屏幕重绘
  • 小部件库
  • 所有文本元素支持UTF-8
  • 用于小部件开发的绘图原语(Go函数),具有字符和子字符分辨率

使用示例

大多数元素的用法在termdashdemo.go中演示。要运行演示:

go run termdashdemo/termdashdemo.go

termdashdemo

实现的小部件

按钮(Button)

允许用户与应用程序交互,每次按钮按下都会运行回调函数。

go run widgets/button/buttondemo/buttondemo.go

buttondemo

文本输入(TextInput)

允许用户通过输入、编辑和提交文本数据与应用程序交互。

go run widgets/textinput/textinputdemo/textinputdemo.go

textinputdemo

可以用于创建支持键盘导航的文本输入表单:

go run widgets/textinput/formdemo/formdemo.go

formdemo

仪表(Gauge)

显示操作的进度。

go run widgets/gauge/gaugedemo/gaugedemo.go

gaugedemo

圆环图(Donut)

将操作的进度可视化为部分或完整的圆环。

go run widgets/donut/donutdemo/donutdemo.go

donutdemo

文本(Text)

显示文本内容,支持内容修剪和滚动。

go run widgets/text/textdemo/textdemo.go

textdemo

迷你图(SparkLine)

绘制一个图表,将一系列值显示为垂直条。

go run widgets/sparkline/sparklinedemo/sparklinedemo.go

sparklinedemo

条形图(BarChart)

显示多个条形图,显示值的相对比率。

go run widgets/barchart/barchartdemo/barchartdemo.go

barchartdemo

折线图(LineChart)

在线图上显示一系列值,支持通过鼠标事件触发的缩放。

go run widgets/linechart/linechartdemo/linechartdemo.go

linechartdemo

段式显示(SegmentDisplay)

通过模拟16段显示来显示文本。

go run widgets/segmentdisplay/segmentdisplaydemo/segmentdisplaydemo.go

segmentdisplaydemo

完整示例代码

以下是一个简单的Termdash仪表盘示例:

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/mum4k/termdash"
	"github.com/mum4k/termdash/cell"
	"github.com/mum4k/termdash/container"
	"github.com/mum4k/termdash/linestyle"
	"github.com/mum4k/termdash/terminal/tcell"
	"github.com/mum4k/termdash/terminal/terminalapi"
	"github.com/mum4k/termdash/widgets/text"
)

func main() {
	// 创建终端
	t, err := tcell.New()
	if err != nil {
		panic(err)
	}
	defer t.Close()

	// 创建文本小部件
	textWidget, err := text.New()
	if err != nil {
		panic(err)
	}

	// 更新文本内容
	go func() {
		for i := 0; ; i++ {
			if err := textWidget.Write(fmt.Sprintf("Counter: %d\n", i), text.WriteReplace()); err != nil {
				panic(err)
			}
			time.Sleep(1 * time.Second)
		}
	}()

	// 创建容器布局
	c, err := container.New(
		t,
		container.Border(linestyle.Light),
		container.BorderTitle("PRESS Q TO QUIT"),
		container.BorderColor(cell.ColorYellow),
		container.PlaceWidget(textWidget),
	)
	if err != nil {
		panic(err)
	}

	// 上下文用于取消
	ctx, cancel := context.WithCancel(context.Background())

	// 监听键盘事件
	quitter := func(k *terminalapi.Keyboard) {
		if k.Key == 'q' || k.Key == 'Q' {
			cancel()
		}
	}

	// 启动Termdash
	if err := termdash.Run(ctx, t, c, termdash.KeyboardSubscriber(quitter)); err != nil {
		panic(err)
	}
}

文档

请参考Termdash wiki获取所有文档和资源。

类似项目

免责声明

这不是官方的Google产品。


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

1 回复

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


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

在Golang中开发终端仪表盘,termdash和termui是两个非常流行的库。下面我将介绍它们的基本用法和示例代码。

1. termdash简介与使用

termdash是一个功能丰富的终端仪表盘库,提供了灵活的布局系统和多种组件。

基本示例

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/mum4k/termdash"
	"github.com/mum4k/termdash/cell"
	"github.com/mum4k/termdash/container"
	"github.com/mum4k/termdash/linestyle"
	"github.com/mum4k/termdash/terminal/termbox"
	"github.com/mum4k/termdash/terminal/terminalapi"
	"github.com/mum4k/termdash/widgets/text"
)

func main() {
	// 初始化终端
	t, err := termbox.New()
	if err != nil {
		panic(err)
	}
	defer t.Close()

	ctx, cancel := context.WithCancel(context.Background())

	// 创建文本组件
	textWidget, err := text.New()
	if err != nil {
		panic(err)
	}

	// 更新文本内容
	go func() {
		ticker := time.NewTicker(1 * time.Second)
		defer ticker.Stop()

		for i := 0; ; i++ {
			select {
			case <-ticker.C:
				str := fmt.Sprintf("当前时间: %v\n计数器: %d", time.Now().Format("15:04:05"), i)
				if err := textWidget.Write(str, text.WriteReplace()); err != nil {
					panic(err)
				}
			case <-ctx.Done():
				return
			}
		}
	}()

	// 设置容器布局
	c, err := container.New(
		t,
		container.Border(linestyle.Light),
		container.BorderTitle("TERMDASH 仪表盘 (按ESC退出)"),
		container.BorderColor(cell.ColorYellow),
		container.PlaceWidget(textWidget),
	)
	if err != nil {
		panic(err)
	}

	// 设置键盘退出
	quitter := func(k *terminalapi.Keyboard) {
		if k.Key == 'q' || k.Key == keyboard.KeyEsc {
			cancel()
		}
	}

	// 启动仪表盘
	if err := termdash.Run(ctx, t, c, termdash.KeyboardSubscriber(quitter)); err != nil {
		panic(err)
	}
}

termdash主要特性

  1. 灵活的布局系统:支持网格、行、列等多种布局方式
  2. 丰富的组件:包括文本、图表、进度条等
  3. 主题支持:可以自定义颜色和样式
  4. 键盘和鼠标事件处理

2. termui简介与使用

termui是另一个流行的终端仪表盘库,API设计简洁。

基本示例

package main

import (
	"fmt"
	"log"
	"time"

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

func main() {
	// 初始化UI
	if err := ui.Init(); err != nil {
		log.Fatalf("初始化termui失败: %v", err)
	}
	defer ui.Close()

	// 创建段落组件
	p := widgets.NewParagraph()
	p.Title = "系统信息"
	p.Text = "正在加载数据..."
	p.SetRect(0, 0, 50, 5)
	p.BorderStyle.Fg = ui.ColorYellow

	// 创建列表组件
	l := widgets.NewList()
	l.Title = "日志"
	l.Rows = []string{
		"系统启动",
		"初始化完成",
	}
	l.SetRect(0, 5, 50, 12)
	l.TextStyle = ui.NewStyle(ui.ColorGreen)

	// 创建进度条
	g := widgets.NewGauge()
	g.Title = "CPU使用率"
	g.Percent = 50
	g.SetRect(0, 12, 50, 15)
	g.BarColor = ui.ColorRed
	g.BorderStyle.Fg = ui.ColorWhite

	// 渲染组件
	ui.Render(p, l, g)

	// 更新数据的goroutine
	go func() {
		ticker := time.NewTicker(time.Second)
		for range ticker.C {
			p.Text = fmt.Sprintf("当前时间: %v\n主机名: localhost", time.Now().Format("15:04:05"))
			g.Percent = (g.Percent + 10) % 100
			l.Rows = append(l.Rows, fmt.Sprintf("事件 %d", time.Now().Unix()))
			if len(l.Rows) > 10 {
				l.Rows = l.Rows[1:]
			}
			ui.Render(p, l, g)
		}
	}()

	// 事件循环
	uiEvents := ui.PollEvents()
	for {
		e := <-uiEvents
		switch e.ID {
		case "q", "<C-c>":
			return
		case "<Resize>":
			payload := e.Payload.(ui.Resize)
			p.SetRect(0, 0, payload.Width, 5)
			l.SetRect(0, 5, payload.Width, 12)
			g.SetRect(0, 12, payload.Width, 15)
			ui.Render(p, l, g)
		}
	}
}

termui主要特性

  1. 简单易用的API:快速创建仪表盘
  2. 响应式设计:自动处理终端大小变化
  3. 多种内置组件:图表、表格、进度条等
  4. 轻量级:依赖较少

3. 如何选择

  • termdash适合更复杂的布局需求,有更精细的控制
  • termui适合快速开发简单的仪表盘,学习曲线较低

4. 高级用法

termdash图表示例

// 在termdash中添加图表
lineChart, err := barchart.New(
	barchart.BarColors([]cell.Color{
		cell.ColorRed,
		cell.ColorGreen,
	}),
	barchart.ValueColors([]cell.Color{
		cell.ColorBlack,
		cell.ColorBlack,
	}),
	barchart.ShowValues(),
)

values := []int{10, 20, 30, 40, 50}
if err := lineChart.Values(values, 50); err != nil {
	panic(err)
}

termui图表示例

// 在termui中添加图表
bc := widgets.NewBarChart()
bc.Title = "Bar Chart"
bc.Data = []float64{3, 2, 5, 3, 9, 5, 3, 2, 5, 8, 3, 2}
bc.Labels = []string{"S0", "S1", "S2", "S3", "S4", "S5"}
bc.SetRect(50, 0, 100, 10)
bc.BarWidth = 5
bc.BarColors = []ui.Color{ui.ColorRed, ui.ColorGreen}
bc.LabelStyles = []ui.Style{ui.NewStyle(ui.ColorBlue)}
bc.NumStyles = []ui.Style{ui.NewStyle(ui.ColorYellow)}

5. 总结

termdash和termui都是优秀的Golang终端仪表盘库,选择哪个取决于项目需求:

  1. 需要复杂布局和精细控制 → 选择termdash
  2. 需要快速开发和简单实现 → 选择termui

两者都可以创建出功能丰富、视觉效果良好的终端仪表盘应用。

回到顶部