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
实现的小部件
按钮(Button)
允许用户与应用程序交互,每次按钮按下都会运行回调函数。
go run widgets/button/buttondemo/buttondemo.go
文本输入(TextInput)
允许用户通过输入、编辑和提交文本数据与应用程序交互。
go run widgets/textinput/textinputdemo/textinputdemo.go
可以用于创建支持键盘导航的文本输入表单:
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)
通过模拟16段显示来显示文本。
go run widgets/segmentdisplay/segmentdisplaydemo/segmentdisplaydemo.go
完整示例代码
以下是一个简单的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
更多关于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主要特性
- 灵活的布局系统:支持网格、行、列等多种布局方式
- 丰富的组件:包括文本、图表、进度条等
- 主题支持:可以自定义颜色和样式
- 键盘和鼠标事件处理
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主要特性
- 简单易用的API:快速创建仪表盘
- 响应式设计:自动处理终端大小变化
- 多种内置组件:图表、表格、进度条等
- 轻量级:依赖较少
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终端仪表盘库,选择哪个取决于项目需求:
- 需要复杂布局和精细控制 → 选择termdash
- 需要快速开发和简单实现 → 选择termui
两者都可以创建出功能丰富、视觉效果良好的终端仪表盘应用。