如何用Go语言gizak/termui包创建可填充字符的8×8网格?
使用gizak/termui创建8×8网格的可行方案
你的代码触发panic的核心原因是ui.NewRow和ui.NewCol的参数类型不符合要求:这两个方法需要接收termui官方Widget类型作为内容载体,而非普通字符串;同时NewRow的第二个参数需要传入列的集合(多个Col对象或Col切片)。
以下是修正后的完整可行代码:
package main import ( "github.com/gizak/termui/v3" "github.com/gizak/termui/v3/widgets" ) func main() { // 初始化termui终端UI if err := termui.Init(); err != nil { panic(err) } defer termui.Close() screenWidth, screenHeight := termui.TerminalDimensions() // 创建网格并设置其在终端中的位置 grid := termui.NewGrid() grid.SetRect(screenWidth/2-30, screenHeight/2-8, screenWidth/2+30, screenHeight/2+8) var rows []interface{} // 构建8行 for i := 0; i < 8; i++ { var cols []interface{} // 每行构建8列 for j := 0; j < 8; j++ { // 创建Paragraph组件作为单元格,用于显示任意字符 cell := widgets.NewParagraph() cell.Text = "-" // 初始填充字符,后续可修改为任意内容 cell.Border = true // 显示边框,清晰区分单元格 // 每个列占网格宽度的1/8 cols = append(cols, termui.NewCol(1.0/8, cell)) } // 每行占网格高度的1/8,传入该行的所有列 rows = append(rows, termui.NewRow(1.0/8, cols...)) } // 将构建好的行集合设置到网格中 grid.Set(rows...) // 渲染网格到终端 termui.Render(grid) // 监听退出事件(按q或Ctrl+C退出) for e := range termui.PollEvents() { if e.ID == "q" || e.ID == "<C-c>" { break } } }
关键修正说明
- 用
widgets.NewParagraph()创建单元格:这是termui支持的标准Widget,能承载文本内容,符合grid组件的类型要求 - 修正
NewCol参数:传入Paragraph实例而非字符串,确保类型匹配 - 修正
NewRow参数:用cols...展开列切片,传入完整的列集合,而非单个无效字符串 - 可选的边框设置:
cell.Border = true让网格结构更直观,可根据需求移除
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

