You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:35:12