golang终端仪表盘开发插件库termdash的使用
Golang终端仪表盘开发插件库termdash的使用
termdash是一个跨平台可定制的终端仪表盘库,功能集受到gizak/termui项目的启发。
主要特性
- 全终端窗口大小调整支持
- 可定制布局、小部件放置、边框、边距、填充、颜色等
- 运行时动态布局变化
- 二叉树和网格形式的布局设置
- 可聚焦的容器和小部件
- 键盘和鼠标事件处理
- 定期和事件驱动的屏幕重绘
- 丰富的widget库
- 所有文本元素支持UTF-8
- 用于widget开发的绘图原语(Go函数),具有字符和子字符分辨率
安装
go get -u github.com/mum4k/termdash
cd github.com/mum4k/termdash
使用示例
termdashdemo.go展示了大部分功能的用法,可以通过以下命令运行演示:
go run termdashdemo/termdashdemo.go
Widget示例
termdash提供了多种widget,每个widget都有对应的demo:
按钮(Button)
go run widgets/button/buttondemo/buttondemo.go
文本输入(TextInput)
go run widgets/textinput/textinputdemo/textinputdemo.go
表单(Form)
go run widgets/textinput/formdemo/formdemo.go
进度条(Gauge)
go run widgets/gauge/gaugedemo/gaugedemo.go
环形图(Donut)
go run widgets/donut/donutdemo/donutdemo.go
文本显示(Text)
go run widgets/text/textdemo/textdemo.go
迷你图(SparkLine)
go run widgets/sparkline/sparklinedemo/sparklinedemo.go
柱状图(BarChart)
go run widgets/barchart/barchartdemo/barchartdemo.go
折线图(LineChart)
go run widgets/linechart/linechartdemo/linechartdemo.go
分段显示器(SegmentDisplay)
go run widgets/segmentdisplay/segmentdisplaydemo/segmentdisplaydemo.go
基本示例代码
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的基本用法:
- 创建终端接口
- 创建widget(这里是文本widget)
- 设置容器的布局和边框
- 处理键盘事件
- 运行仪表盘
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),
),
),
)
最佳实践
- 性能优化:避免过于频繁的界面刷新,通常100-500ms的刷新间隔足够
- 错误处理:所有widget操作都可能返回错误,应该妥善处理
- 资源清理:确保在退出时关闭终端和清理资源
- 响应式设计:考虑终端大小变化,使用
container.Option
来适应不同尺寸
总结
termdash提供了丰富的组件和灵活的布局系统,可以创建功能强大的终端仪表盘。通过组合各种widget和容器,你可以构建出满足各种需求的监控界面。记得查阅官方文档获取更多高级功能和详细API说明。