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

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

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

termdashlogo

主要特性

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

安装

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

使用示例

termdashdemo.go展示了大部分功能的用法,可以通过以下命令运行演示:

go run termdashdemo/termdashdemo.go

termdashdemo

Widget示例

termdash提供了多种widget,每个widget都有对应的demo:

按钮(Button)

go run widgets/button/buttondemo/buttondemo.go

buttondemo

文本输入(TextInput)

go run widgets/textinput/textinputdemo/textinputdemo.go

textinputdemo

表单(Form)

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)

go run widgets/segmentdisplay/segmentdisplaydemo/segmentdisplaydemo.go

segmentdisplaydemo

基本示例代码

package main

import (
	"context"
	"time"

	"github.com/mum4k/termdash"
	"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()

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

	// 更新文本内容
	go func() {
		for i := 0; ; i++ {
			txt.Write("Hello Termdash! ", text.WriteCellOpts(text.FgColor(terminalapi.ColorRed)))
			time.Sleep(500 * time.Millisecond)
		}
	}()

	// 创建容器布局
	c, err := container.New(
		t,
		container.Border(linestyle.Light),
		container.BorderTitle("PRESS Q TO QUIT"),
		container.PlaceWidget(txt),
	)
	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的基本用法:

  1. 创建终端接口
  2. 创建widget(这里是文本widget)
  3. 设置容器的布局和边框
  4. 处理键盘事件
  5. 运行仪表盘

termdash提供了丰富的widget和布局选项,可以根据需要组合使用这些组件来创建复杂的终端仪表盘应用。


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

1 回复

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


Golang终端仪表盘开发:使用termdash库

termdash是一个强大的Go语言库,用于在终端中创建丰富的仪表盘和交互式界面。它提供了各种组件如文本显示、图表、进度条等,非常适合开发监控工具、CLI仪表盘等应用。

安装termdash

首先安装termdash及其依赖:

go get github.com/mum4k/termdash
go get github.com/mum4k/termdash/terminal/termbox

基础示例

下面是一个简单的termdash仪表盘示例:

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/mum4k/termdash"
	"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()

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

	// 更新文本内容
	go func() {
		ticker := time.NewTicker(1 * time.Second)
		defer ticker.Stop()
		for {
			select {
			case <-ticker.C:
				now := time.Now().Format("2006-01-02 15:04:05")
				if err := textWidget.Write(fmt.Sprintf("当前时间: %s\n", now), text.WriteReplace()); err != nil {
					panic(err)
				}
			}
		}
	}()

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

	// 上下文用于退出
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

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

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

常用组件

1. 文本显示

textWidget, err := text.New(
    text.RollContent(),
    text.WrapAtRunes(),
)
textWidget.Write("Hello, Termdash!", text.WriteReplace())

2. 进度条

progressBar, err := barchart.New(
    barchart.ShowValues(),
    barchart.BarWidth(4),
)
values := []int{30, 50, 20, 80}
progressBar.Values(values, 100)

3. 折线图

lineChart, err := linechart.New(
    linechart.AxesCellOpts(cell.FgColor(cell.ColorRed)),
    linechart.YLabelCellOpts(cell.FgColor(cell.ColorGreen)),
)
data := []float64{1, 2, 3, 4, 3, 2, 5, 6, 7, 8}
lineChart.Series("data", data)

4. 仪表盘

gauge, err := gauge.New(
    gauge.Height(1),
    gauge.Border(linestyle.Light),
    gauge.Color(cell.ColorGreen),
)
gauge.Percent(75) // 设置百分比

复杂布局示例

c, err := container.New(
    t,
    container.Border(linestyle.Light),
    container.BorderTitle("系统监控"),
    container.SplitHorizontal(
        container.Top(
            container.SplitVertical(
                container.Left(
                    container.Border(linestyle.Light),
                    container.BorderTitle("CPU使用率"),
                    container.PlaceWidget(cpuGauge),
                ),
                container.Right(
                    container.Border(linestyle.Light),
                    container.BorderTitle("内存使用"),
                    container.PlaceWidget(memChart),
                ),
            ),
        ),
        container.Bottom(
            container.Border(linestyle.Light),
            container.BorderTitle("日志"),
            container.PlaceWidget(logText),
        ),
    ),
)

最佳实践

  1. 性能优化:避免过于频繁的界面刷新,通常100-500ms的刷新间隔足够
  2. 错误处理:所有widget操作都可能返回错误,应该妥善处理
  3. 资源清理:确保在退出时关闭终端和清理资源
  4. 响应式设计:考虑终端大小变化,使用container.Option来适应不同尺寸

总结

termdash提供了丰富的组件和灵活的布局系统,可以创建功能强大的终端仪表盘。通过组合各种widget和容器,你可以构建出满足各种需求的监控界面。记得查阅官方文档获取更多高级功能和详细API说明。

回到顶部