跳转到主要内容

一个命令行程序,可以在终端中绘制漂亮的彩色动画圆圈。

项目描述

我曾见过你们无法相信的事情。在奥里恩肩膀上的着火攻击飞船。我看着c-beams在黑暗中闪耀,靠近坦纳豪泽之门。所有这些时刻都会像雨中的泪水一样,在时间的流逝中消失。是时候死了。

click to see animation

点击截图查看其动态的asciicast(感谢asciinema!)在本地大型终端中运行时看起来更好,动画更流畅。您应该下载并运行它!

$ pip install --user cbeams
$ cbeams

以二进制可执行文件形式下载

较旧版本包含Linux二进制可执行文件,可从以下地址下载

https://github.com/tartley/cbeams/releases

但我不再构建这些了。请使用上面所述的pip从PyPI获取。

以源代码形式下载

依赖项

在Ubuntu 14.04上开发,可能在其他Linux上也能工作。在OSX上也能工作。在Windows上无法工作。

在Python 3.4 & 3.5上进行了测试。最近的版本在3.8上。可能也在其他3.x版本上运行。在2.x版本上无法运行。

Python依赖项在setup.py中指定。

用法

cbeams [-o]
cbeams [-h]

-o  Overwrites one screenful of the existing terminal contents
-h  Displays help.

按ctrl-C退出cbeams,回到常规终端缓冲区,这样动画就不会覆盖您之前的任何终端内容。

为了娱乐,还有一个'-o'参数,它可以覆盖终端文本而不翻页缓冲区。所以你可以看到慢慢扩大的圆圈逐渐吞噬你的现有终端文本,但是当你按下Ctrl+C时,无法恢复终端。因此,你终端的一屏文本被覆盖并丢失。

我为什么要开发这个程序呢?

在终端中实现颜色或动画的传统方式是使用备受尊敬的UNIX库'curses',或者它的开源克隆'ncurses'。有很多Python包公开了ncurses以供各种用途。任何使用过这些包的人都知道,curses是现有API中非常糟糕的一个。它系统地暴露了调用者所面临的底层实现的意外复杂性,这些复杂性是经过几十年支持不同终端和终端仿真器所积累的。

幸运的是,现在有了一种更好的方法。Erik Rose的'Blessings'包在ncurses之上叠加了一个合理的API。文档页面显示了如何将使用curses的21行难以理解的代码转换为使用blessings的四个简单代码行。

我想找个借口学习blessings的工作原理,cbeams就是结果。

我将它附加到长时间运行的命令的末尾,用作命令完成的视觉通知。

它是如何工作的

除了使用Blessings之外,这个项目的另一个有趣的部分是表示圆圈。

显然,模型将圆圈表示为中心点、半径和颜色。为了显示这些,我们将它们转换为对输出到终端有用的表示。具体来说,每个圆圈被转换为一系列的水平切片。每个切片有一个垂直位置、最左侧的起始位置和最右侧的结束位置。为了在终端中显示这些,我们只需为每个切片打印一行彩色空格。我们注意确保最终打印的形状在垂直和水平轴上都是对称的。

有趣的是,这种表示作为一系列水平切片的方法也适用于表示其他任意形状,而不仅仅是圆圈。

考虑到这一点,显然动画实际上并不只是显示圆圈。它们是圆环或环。所以每个环被建模为两个圆圈,一个是带颜色的外圆圈,另一个是半径较小的内圆圈。

要显示一个环,我们不仅仅绘制外圆圈,然后通过绘制黑色的内圆圈来覆盖它。这会产生令人烦恼的闪烁(没有双缓冲或vsync),并且还会阻止我们看到每个环的孔。相反,我们执行“外圆圈 - 内圆圈”的空间减法来构造一个新的形状——一系列水平切片表示的环。

编写一个任意空间操作符来执行此操作很诱人,它可以从表示为一系列切片的任意形状中减去另一个形状,并产生一个新的切片序列。虽然这可能会令人满意,但显然超出了这个项目的范围,因此,测试驱动开发正确地引导我走向一个更简单的函数,它使用对输入形状的了解,以更少的代码行生成所需输出。

因此,绘制环可以使用我们之前描述的绘制圆圈的确切程序。只需迭代切片,为每个切片打印适当的长度彩色空格条带。

然后,在每一帧中,我们将每个环的内圆和外圆半径渐近增加到环预定的“最大半径”。当内半径接近这个值时,我们将该环从世界中移除。

尽管如此,还有一个额外的复杂性。我们上面描述的方法在存在双缓冲机制的情况下将非常有效,这种机制下,每一帧都会擦除整个后缓冲区,然后在其中绘制下一帧的全部内容,然后再交换缓冲区。然而,这种机制并不存在。因此,按照上述方法连续绘制帧不会在圆环的内半径经过字符方格后擦除颜色。

为了实现这一点,我们不是绘制当前帧的期望外观,而是绘制当前帧与上一帧之间的差异。因此,我们在外半径外绘制一个薄薄的彩色圆环,在内半径内绘制一个薄薄的黑色圆环。

这些薄薄的“差异”圆环的宽度仅仅是当前半径值与上一帧之间的差值。因此,它们通常比一个字符的宽度还小,以一系列离散的点形式散布在每个可见圆的内外边缘。在连续的帧中,彩色点逐渐扩大外半径,而黑色点则逐渐侵蚀内半径,在那里扩大黑洞。

以这种方式绘制连续帧之间的微小差异,可以防止重叠的圆在每帧都不断重新绘制整个圆环时出现严重的闪烁。

此外,这最终使程序运行得更快,动画看起来也更加流畅,因为我们每帧需要绘制到终端的字符更少。

我们还在每帧以随机概率向世界添加新的圆环。这个概率随时间正弦变化,因此动画中会有安静和嘈杂的时刻。

新的圆环被分配一个从当前允许的颜色集中随机选择的颜色。我们随着时间的推移向该集添加和删除颜色,因此有时所有环都是相同的颜色,有时是两种颜色,有时是许多颜色。这有助于使动画随时间演变,而不是一直看起来太“相似”。

黑客技术

要填充虚拟环境、运行测试等,请参阅Makefile中的命令。这些命令通常在Windows的Cygwin、Msys等Bash外壳中也可以使用。

按照Makefile中所示的方式填充虚拟环境还将向虚拟环境添加“-e .”,这意味着源编辑将在虚拟环境中立即可见,并且setup.py中列出的应用程序入口点将被转换为PATH上的可执行脚本。

感谢

感谢Erik Rose,感谢出色的Blessings包。 https://pypi.python.org/pypi/blessings

链接和联系方式

Python包:http://pypi.python.org/pypi/cbeams/

二进制文件、源代码、问题:https://github.com/tartley/cbeams/

作者:Jonathan Hartley,电子邮件:tartley@domain tartley.com,Twitter:@tartley。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源代码发行版

cbeams-1.0.3.tar.gz (14.4 kB 查看哈希值)

上传时间 源代码

构建发行版

cbeams-1.0.3-py3-none-any.whl (10.4 kB 查看哈希值)

上传于 Python 3

由...

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面