我想在Python下使用Curses而不清除屏幕。原因是我希望我的应用程序在现有屏幕上弹出一个简单的小菜单并很快退出。退出时将弹出菜单中丑陋的部分保留在屏幕上是可以接受的,但不是首选。我们的想法是将其用于快速实用的系统管理应用程序和脚本,其中美观并不重要。
Python 的 init 函数似乎总是清屏。我还记得几年前看到一个非 Python 应用程序做了我喜欢的事情,所以我知道这是可能的,至少在 C Curses 程序中。
我不会说“这是不可能的”,但我会用库存、开箱即用的 Curses/NCurses 说“这是不可能的”。
根本问题是,curses 库在初始化时无法访问终端的当前状态,特别是当前正在显示的字符和字形。
在过去的 PC 上,屏幕是内存映射的,因此当程序运行时,它可以访问现有的屏幕状态,以便捕获并可能在以后恢复它。
对于一般的智能终端来说,情况不一定如此。在 Linux 或 Mac 上,终端类型是某种“xterm”。在 Windows 控制台终端上,它是 ANSI 风格的终端(mind xterm 也是一种 ANSI 终端)。终端类型是 termcap/terminfo 库使用的代码,curses 依赖于它来了解如何移动光标、删除字符和线条、设置颜色或反转视频等。
curses 与屏幕的所有交互都是通过打印 ESCape 序列,而不是操纵内存。它不适用于帧缓冲区。
如果您查看 XTerm 转义序列 列表,您会发现没有任何内容可以将屏幕内容报告回主机程序。然而,还有一个备用帧缓冲区。一个例子也许是
vim
。当您使用 vim
编辑文件时,vim
会占据整个屏幕。但当您退出时,您的原始屏幕将恢复。 vim
正在切换到备用屏幕缓冲区,并在那里执行所有操作,然后在退出时恢复主屏幕缓冲区。但这是一个简单的切换练习,vim
不“知道”,也无法访问原始屏幕缓冲区的内容。
如果您使用 Linux 控制台(您可以使用 F 键切换屏幕)或 GNU Screen 等实用程序,则这些是不同的。它们依赖于不同的概念(Linux 控制台的设备驱动程序和 GNU Screen 的伪终端),并且整个程序维护每个屏幕本身的状态。但据我所知,这些信息不适用于通用程序。如果是,那是通过某种专有方法而不是 Curses。