使用urwid同时输入和输出

时间:2019-05-08 20:25:12

标签: python-3.x console urwid

我正在用Python3编写服务器应用程序以同时处理和管理多个客户端连接。我需要能够将数据发送到客户端,同时还要立即打印它们发送的所有内容以及程序中的任何信息。关于此的大多数答案都建议使用Urwid或Curses。我之所以选择urwid,主要是因为它更高级,更难以搞混。

在浏览了文档,一些教程和示例之后,我设法将这段代码拼凑在一起:

import urwid

def await_command():
    return urwid.Pile([urwid.Edit(("root@localhost~# "))])

# This will actually send the command in the future and wait for a reply
def process_command(command):
    return urwid.Text(("root@localhost~# " + command + "\nCommand [" + command + "] executed successfully!"))

class CommandListBox(urwid.ListBox):
    def __init__(self):
        body = urwid.SimpleFocusListWalker([await_command()])
        super().__init__(body)

    def keypress(self, size, key):
        key = super().keypress(size, key)
        if key != 'enter': return key
        try: command = self.focus[0].edit_text
        except TypeError: return
        pos = self.focus_position
        self.body.insert(pos, process_command(command))
        self.focus_position = pos + 1
        self.focus[0].set_edit_text("")

main_screen_loop = urwid.MainLoop(CommandListBox()).run()

除了可以在等待输入的当前行上方插入文本外,这与普通终端非常相似。

作为Urwid的一个完整的新手,我不知道该如何用Python完成。我猜这只是涉及找到我们所在的行,并在其上方插入新行。谁能提供一个有关如何完成此操作的示例?也欢迎对我的代码进行任何改进。

预先感谢:)

1 个答案:

答案 0 :(得分:0)

事实证明,这非常简单。如果有人遇到类似问题,请将其发布。仍欢迎任何更正和改进。

这是为我做的:

def print(self, text): # A method of the CommandListBox function
    """Insert text just above where the cursor currently is."""
    self.body.insert(self.focus_position, urwid.Text(text))

这似乎还不是万无一失的方法,因为光标的位置可以改变,但到目前为止它仍然可以工作。