如何在基于tview的Go应用中获取屏幕尺寸(宽高)
在tview中获取终端屏幕尺寸的方法
方法一:通过tview Application实例获取(推荐)
tview的Application内部已经封装了tcell的Screen实例,你可以通过app.GetScreen()拿到它,再调用Size()获取宽高。但要注意,必须在app.Run()启动之后或者屏幕完成初始化的时机调用,不然会拿到nil或者0值。
比如可以在启动后的绘制回调里获取,或者在组件的交互事件中使用:
package main import ( "fmt" "github.com/rivo/tview" "github.com/gdamore/tcell/v2" ) func main() { app := tview.NewApplication() // 应用启动后首次绘制时获取尺寸 app.SetAfterDraw(func(screen tcell.Screen) bool { width, height := screen.Size() fmt.Printf("当前屏幕尺寸:宽%d,高%d\n", width, height) return false // 返回false表示继续执行后续绘制逻辑 }) // 点击按钮时获取并更新按钮文本 btn := tview.NewButton("点击获取屏幕尺寸").SetSelectedFunc(func() { if screen := app.GetScreen(); screen != nil { w, h := screen.Size() btn.SetLabel(fmt.Sprintf("宽:%d 高:%d", w, h)) app.Draw() // 强制刷新界面 } }) if err := app.SetRoot(btn, true).Run(); err != nil { panic(err) } }
方法二:直接使用tcell包获取
如果不需要启动tview应用,或者想单独获取尺寸,可以直接用tcell,但要手动初始化和关闭屏幕——这也是你之前可能踩坑的点:必须先初始化屏幕才能调用Size()。
示例代码:
package main import ( "fmt" "github.com/gdamore/tcell/v2" ) func getTerminalSize() (int, int, error) { screen, err := tcell.NewScreen() if err != nil { return 0, 0, err } // 初始化屏幕 if err := screen.Init(); err != nil { return 0, 0, err } defer screen.Fini() // 用完必须关闭,避免终端状态异常 return screen.Size() } func main() { w, h, err := getTerminalSize() if err != nil { fmt.Printf("获取尺寸失败:%v\n", err) return } fmt.Printf("屏幕尺寸:宽%d,高%d\n", w, h) }
额外注意事项
- 要是需要监听屏幕尺寸变化(比如用户拖动终端窗口),可以把尺寸检查逻辑放在
SetAfterDraw回调里,每次界面绘制时都检查尺寸,动态调整布局。 - 不要在
app.Run()之前调用app.GetScreen(),此时屏幕还没初始化,会返回nil。
内容的提问来源于stack exchange,提问作者nilu2039
相关产品推荐
相关产品推荐

