实现具有底部编辑行、状态栏和滚动历史记录的"console shell"的最佳方法?



这是一个相当复杂的问题,但我希望有一个库可以快速完成我想要做的事情。

对我来说,开始解释这一点的最好方法是用一个期望输出的例子:

+------------------------------------------------+
| TESTAPP v0.1 (C) Test Company          Running |
| ---------------------------------------------- |
| info: This is a logged message.                |
| input: user typed "hello"                      |
| info: This is a logged message.                |
| debug: option 1 code 2 value 3                 |
| info: The debug line was just printed.         |
| --Status: [Opts 1] [Codes 5] [Values 11]    -- |
| > about to press enter...                      |
+------------------------------------------------+

零件:

+------------------------------------------------+
| TITLE BAR -- TITLE BAR -- TITLE BAR -- TITLE   |
| ...                                            |
| ...                                            |
| ...scrolling log area...                       |
| ...                                            |
| ...                                            |
| ...                                            |
| STATUS BAR -- STATUS BAR -- STATUS BAR --      |
| > INPUT LINE -- INPUT LINE -- INPUT LINE     < |
+------------------------------------------------+

以下是要点:

  • 一个Python程序,它将在启动后进入全屏
  • 最上面的一行将是一个标题栏,其中可能包含一些可更新的区域
  • 标题栏正下方的行可以是一个分隔符(不一定需要)
  • 最下面的一行将是输入行
  • 输入行正上方的行将是一条状态行,它将被频繁更新
  • 状态行上方的一行可以用作分隔符,但不一定是必需的
  • 屏幕中央的其余行将是滚动历史视图。应用程序将向该区域写入行,在该区域满后,最早的行将滚动出屏幕
  • 一个向后滚动的缓冲区会很好,但不是绝对必要的
  • 状态栏和标题栏需要颜色输出,但可以接受简单的反转
  • 输入行应该支持readline样式的历史记录等等
  • 此外,它需要向左推动和滚动,而不是换行,这样,如果用户键入太多文本,整个UI就不会被推离屏幕

示例:

| info: The debug line was just printed.         |
| --Status: [Opts 1] [Codes 5] [Values 11]    -- |
| > ...men to come to the aid of their country._ |
+------------------------------------------------+

基本上,我正在编写一个服务器,我希望它在控制台上是可控的。简单地将服务器放在线程上并启动raw_input循环的简单方法意味着从服务器到控制台的输出很容易中断文本的输入。

举个更简洁的例子,想想irssi或epicII。

理论上,我可以使用curses库和大量的工作自己编写所有这些代码,但我觉得可能有某种库,或者至少有一些捷径可以实现这一点。我对诅咒库不是很熟悉。除非有一个非常好的、简洁的快速入门指南,否则我觉得我最终会花更多的时间来理解我在编写实际服务器代码时的诅咒。:-)

pycurses怎么了?它只是ncurses的包装。节省重新发明轮子的时间。

例如

  • http://yannik520.github.io/pycurses_example.html
  • pycurses小部件

在回答您的问题时,有很多库可以做到这一点:

  • pycurses确保检查[ncurses faq](http://invisible-island.net/ncurses/ncurses.faq.html)
  • 祝福
  • 终端.py
  • npyscreen
  • 倾斜
  • pyscreen

之前的几个问题可能会有所帮助:

  • 使用python动态打印终端
  • 控制台中的文本进度条
  • Python进度条

如果您可以将显示代码保存在一个单独的类中,那么如果您需要使用gui,应该会更容易。你可能也想看看tkinter。

最新更新