Python Curses没有清除屏幕

时间:2014-04-09 09:55:25

标签: python command-line-interface

我想在Python下使用Curses而不清除屏幕。原因是我希望我的应用程序在现有屏幕上弹出一个简单的小菜单,然后很快退出。虽然不是优选的,但是在退出时将弹出菜单的丑陋部分留在屏幕上是可以接受的。我们的想法是将它用于快速实用的系统管理员应用程序和脚本,其中美学并不重要。

似乎Python初始化函数总是清除屏幕。我还记得几年前看到一个非Python应用程序做了我喜欢的事情,所以我知道这是可能的,至少在C Curses程序中是这样。

1 个答案:

答案 0 :(得分:5)

我不会说“它无法完成”,但是我会用“Curses / NCurses”开箱即用“库存无法完成”。

根本问题是curses库在初始化时无法访问终端的当前状态,特别是当前正在显示的字符和字形。

在PC上的旧时代,屏幕是内存映射的,因此当程序运行时,它可以访问现有的屏幕状态,以便捕获并稍后恢复它。

对于通用智能终端,情况不一定如此。在Linux或Mac上,终端类型是某种“xterm”。在Windows控制台终端上,它是ANSI样式终端(mind xterm也是一种ANSI终端)。终端类型是termcap / terminfo库使用的代码,curses依赖于该代码来了解如何移动光标,删除字符和行,设置颜色或反向视频等。

所有与屏幕交互的curses都是通过打印ESCape序列,而不是操纵内存。它不适用于帧缓冲。

如果查看XTerm escape sequences列表,您将看到没有任何内容可以将屏幕内容报告回主机程序。但是,有一个备用帧缓冲区。这方面的一个例子可能是vim。使用vim编辑文件时,vim将占据整个屏幕。但是当您退出时,原始屏幕将恢复。 vim正在切换到备用屏幕缓冲区,并在那里执行所有操作,然后在退出时恢复主屏幕缓冲区。但这是一个简单的切换练习,vim不会“知道”,也无法访问原始屏幕缓冲区的内容。

如果您使用Linux控制台(可以使用FKeys切换屏幕)或GNU Screen之类的实用程序,则会有所不同。这些依赖于不同的概念(Linux控制台的设备驱动程序和GNU Screen的伪终端),整个程序自己维护每个屏幕的状态。但是我知道这个信息不适用于通用程序。如果是,那就是通过一些专有方法而不是Curses。