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

6
我看到一些关于如何获取终端列数和行数的帖子和答案。我是否可以获取终端大小或等效地说,终端使用的字体大小(以像素为单位)?
(我之所以用“等效”这个词是因为终端宽度[px] = 字体宽度[px] * 列数,或者这就是我所说的“终端宽度”。)
我正在寻找在linux上使用python 2有效的方法,但我也欣赏只适用于python 3的答案。谢谢!
5个回答

5
也许吧。如果你的终端软件支持XTerm控制序列,那么序列\e[14t将会告诉你窗口大小的宽度*高度(以像素为单位)。
相关:
  • xtermctl - 把标准的xterm/dtterm窗口控制代码放入shell参数中,方便使用。注意,有些终端不支持所有组合。

3
另一种可能的方法是检查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特性请求以设置这些字段以获取支持矩阵。

有什么想法为什么它不能与stdout重定向一起使用?(例如,当与“read”一起使用时) - skrat
ioctl的第一个参数是文件描述符。使用一个未重定向的数字,例如0,如果你从终端读取但写入到文件。 - egmont
这是因为你的Python标准输入不是终端,而是“echo”命令。请使用适当的Python脚本。 - egmont
1
请注意,在不久的将来,将会有一个新的可移植函数tcgetsize()用于获取此值。有关详细信息,请参见此问题 - fuz
@egmont 这个问题引起了激烈的争论!他们被排除在外的主要原因是它们具有 unsigned short 类型,但委员会担心屏幕在不久的将来可能会变得更大。 - fuz
显示剩余3条评论

2
在Linux中存储终端信息的数据结构是terminfo。这个结构包含了任何一般终端查询所需的信息。它不包含像素信息,因为这对于它旨在指定的纯文本终端不相关。
如果您在一个X兼容终端中运行代码,则可能可以使用控制码,但这很可能不具有可移植性。

1

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

很抱歉,这是不可能的。 TTY是文本终端,不能控制它运行的位置。 因此,如果你的控制台程序在终端中执行,你无法知道它显示在哪里。

然而,你可以使用图形化模式来控制字体、显示等等。 但为什么要用终端呢?你可以使用图形用户界面。


0

tput cols 告诉你列数。
tput lines 告诉你行数。

所以

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接