【问题标题】:Python Curses without clearing screen没有清除屏幕的 Python 诅咒
【发布时间】:2014-05-25 01:02:44
【问题描述】:

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

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

【问题讨论】:

  • 我也有同样的问题。我对答案感到失望,但理解。美学对我来说很重要,所以我会尝试编写这样的 hack:在我的程序启动时截取窗口的屏幕截图,使用 OCD 找出字符,然后启动 Curses 并重现我截取的屏幕截图,然后添加我的用户界面。可能需要本机代码来获取屏幕截图,因为我认为没有任何跨平台或纯 python 方式可以做到这一点。如果我能让它工作,可能会在这里分享答案。
  • 你完成你的应用了吗?你是怎么解决这个问题的?

标签: python command-line-interface


【解决方案1】:

我不会说“无法完成”,但我会说“无法完成”的股票,开箱即用的诅咒/NCurses。

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

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

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

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

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

如果您使用 Linux 控制台(您可以在其中使用 FKey 切换屏幕)或 GNU Screen 之类的实用程序,这些都是不同的。这些依赖于不同的概念(Linux 控制台的设备驱动程序和 GNU Screen 的伪终端),并且整个程序自己维护每个屏幕的状态。但是据我所知,此信息不适用于通用程序。如果是,它是通过某种专有方法而不是诅咒。

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 2014-09-17
    • 1970-01-01
    • 2011-06-13
    • 2014-09-05
    • 2018-02-27
    • 2012-04-08
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多