昨天的帖子,学习了如何让Python程序原地刷新。实现原地刷新以后我又冒出了个新想法,有没有办法让输出的内容带一些颜色呢,这样看起来是不是会更舒服一些呢。
(图源 :pixabay)
简单例子
查了一下果然和上篇文章中用到的回车、换行、退格一样,色彩功能也是用ASCII码\e
配合其它控制内容实现的。试了一下属实很好玩,但是具体使用方法有点晕,乱乱的找不到头绪。
比如这行代码:echo -e 'This is a \033[1;35m test \033[0m!'
可以在终端显示这样的文本:
但是你能看懂代码都是啥意思吗?总之我是看不懂。
作为一个喜欢刨根问底儿的人,有看不懂的代码,如果行数很多也就罢了,这才一行代码,怎么能忍得了。必须搞懂啊,于是一通查资料,比如维基百科上的这篇文章:ANSI escape code
详细解释
通过学习这篇ANSI escape code,我们可以理解上述代码了。
\033
就是ESC啦,也可以用\e
来表示。\033[
表示要开始操作啦
后边可以接几组设置内容,每组内容用;
分割,用m
结束
然后中间放要显示的文本
最后用\033[0m
恢复默认设置
这样在读上述代码,是不是就没有障碍了?
根据ANSI escape code说明,我们可以自由发挥一下,加入更多的设置元素。
比如:echo -e "Normal \e[1;4;33;46mI am oflyhigh! \e[0m"
额,要把颜色调得好看一些,还真是个难题呢!
网上一些文章,写着设置格式:开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m
这个呢,说正确也正确,因为你按照这个格式设置,不会出啥错;说不正确呢,也不正确,因为显示方式;前景色;背景色
这里并没有顺序要求。
比如这段代码:echo -e "Normal \e[33;46;1;4mI am oflyhigh! \e[0m"
和之前的代码,显示结果是一样一样的。
设置部分,可以参考ANSI escape code中SGR (Select Graphic Rendition) parameters
部分。
颜色选择,可以参考ANSI escape code中Colors
部分。
简单的颜色选择,可以使用下表中元素:
比如我们之前示例代码中就使用了这个表中的前景色和背景色。
除此之外,还有更复杂的颜色选择方式:
ESC[ … 38;5;
<n>
… m Select foreground color
ESC[ … 48;5;<n>
… m Select background color
0- 7: standard colors (as in ESC [ 30–37 m)
8- 15: high intensity colors (as in ESC [ 90–97 m)
16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
232-255: grayscale from black to white in 24 steps
例如:echo -e "Normal \e[38;5;9mI am oflyhigh! \e[0m"
又例如:echo -e "Normal \e[48;5;8mI am oflyhigh! \e[0m"
至于24位色,我在putty里试着没成功,可能和putty模拟的终端类型有关,也可能是我代码使用的不对。
其它
除了颜色以外,还有一些其它功能,比如说控制光标。
这样一来,可比我们上篇文章用\r\b
,来控制光标位置高级多了。因为这篇主要讲色彩,就不再此处啰嗦了,回头单独开贴学习。
结论
通过学习ANSI escape code,发现给终端输出的文本设置颜色是一件很简单也很有趣的事情。
但是呢,如何用设置颜色功能设置出来漂亮的颜色,还真是门大学问呢,至少对于我这种审美观奇差的人是相当有难度的啦。
另外,终端设置颜色啥的,终究是小道,人家现在都玩GUI、玩网页,字符界面一般都很少被使用了。不过了解一下也挺好玩的,至少我以前不知道字符界面这么强大呢。
相关链接
This page is synchronized from the post: 每天进步一点点: 终端也可以色彩斑斓