如何获取终端大小或字体大小(像素)?

7 投票
5 回答
6984 浏览
提问于 2025-04-18 00:49

我看到一些帖子和回答,讨论如何获取终端的大小,包括列数和行数。请问我能否以像素为单位获取终端的大小,或者说终端中使用的字体的大小?

我提到等价是因为终端的宽度[像素] = 字体的宽度[像素] * 列数。也就是说,这就是我所说的终端宽度

我在寻找一种可以在Linux上使用Python 2的方法,但我也很感谢只适用于Python 3的答案。谢谢!

5 个回答

0

tput cols 告诉你当前窗口有多少列。
tput lines 告诉你当前窗口有多少行。

所以

from subprocess import check_output
cols = int(check_output(['tput', 'cols']))
lines = int(check_output(['tput', 'lines']))
1

所以,你已经知道如何获取终端的大小(在这里)以字符为单位。

我怕这不太可能实现。TTY是一个文本终端,它无法控制自己运行的位置。所以如果你的控制台程序是在终端中执行的,你就无法知道它显示的位置。

不过,你可以使用图形模式来控制字体、显示等。但为什么要用终端呢?你可以用图形用户界面(GUI)来实现这些功能。

2

在Linux中,用来存储终端信息的数据结构叫做terminfo。这个结构是任何普通终端查询时会读取的内容。它不包含像素信息,因为它是为只显示文本的终端设计的,所以这些信息并不重要。

如果你在一个兼容X的终端中运行代码,可能可以通过控制代码来实现,但这样做很可能不具备可移植性,也就是说在其他终端上可能无法正常工作。

4

还有一种可能的方法,虽然支持有限,就是检查 struct terminfo 中的 ws_xpixel 和 ws_ypixel 值

下面是一个用 Python 查询这些值的代码片段:

import array, fcntl, termios
buf = array.array('H', [0, 0, 0, 0])
fcntl.ioctl(1, termios.TIOCGWINSZ, buf)
print(buf[2], buf[3])

不过,这种方法只在某些终端模拟器中有效,其他的终端模拟器总是会报告 0 0。你可以查看比如 VTE 的功能请求,了解这些字段的支持情况

6

也许可以。如果你的终端软件支持 XTerm控制序列,那么使用这个指令 \e[14t 就可以获取窗口的宽度和高度,以像素为单位。

相关内容:

  • xtermctl - 这个工具可以让你在命令行中方便地使用标准的xterm/dtterm窗口控制代码。需要注意的是,有些终端可能不支持所有的组合。

撰写回答