如何在不清除背景的情况下弹出 ncurses 小部件?

How to popup a ncurses widget without clearing background?

ncurses 通常清除背景并显示 widgets/windows。

我想让 ncurses 像当前会话的助手一样工作,它会在当前 ssh 会话上方 window 弹出

外观将类似于 CMD.exe 实现(见图)

简答:你不能这样做。

长:curses 应用程序是全屏程序,可以清除屏幕以便它们知道屏幕上的内容(因此 curses 库可以优化它的输出:使用最少的工作量)。

您可以编写一个使用自己规则的低级应用程序,例如,使用 terminfo/termcap 接口。即使你 link 它与 ncurses 库一起使用,那也会 而不是 使它成为一个 curses 应用程序,而是一个 terminfo(首选)或 termcap(长期弃用)应用程序。请参阅 ncurses 常见问题解答 Types of library users

要为显示的示例制作一个 terminfo 应用程序,您的应用程序将(副手,可能还有其他事情要做):

  • 使用setupterm.
  • 初始化终端(实际上是应用程序与终端数据库的连接)
  • 如果终端支持,则保存原来的光标位置
  • 清除屏幕的剩余
  • 绘制对话框
  • 运行 你的对话框
  • 使用保存的光标位置,return光标到原来的位置
  • 清除屏幕的剩余部分

根据终端的能力,可能需要不同的方案(终端能力的不同组合)来清除屏幕、绘制对话框等。

在绘制对话框时,您将无法使用任何高级 curses 调用。 python 文档并没有真正概述低级调用。要了解这一点,请阅读 ncurses documentation.

有些人可能会提出替代方案(我不会),但由于终端功能,这些方案具有相同的局限性。

Curses 不是为此而设计的。您应该使用 perl tk 或类似的 GUI 模块。它相当容易使用,并且比 curses 更强大。