如何获取终端大小或字体大小(像素)?
我看到一些帖子和回答,讨论如何获取终端的大小,包括列数和行数。请问我能否以像素为单位获取终端的大小,或者说终端中使用的字体的大小?
我提到等价是因为终端的宽度[像素] = 字体的宽度[像素] * 列数。也就是说,这就是我所说的终端宽度。
我在寻找一种可以在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 的功能请求,了解这些字段的支持情况。