使用 urwid 同时输入输出
Simultaneous input and output using 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 中完成此操作。我猜它只涉及找到我们所在的那一行并在它上面插入一个新的行。谁能举例说明如何做到这一点?也欢迎对我的代码进行任何改进。
提前致谢:)
事实证明,这很简单。发布这个以防有人遇到类似问题。仍然欢迎任何更正和改进。
这就是为我做的:
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))
这似乎仍然不是万无一失的方法,因为光标的位置可以改变,但到目前为止它似乎有效。
我正在 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 中完成此操作。我猜它只涉及找到我们所在的那一行并在它上面插入一个新的行。谁能举例说明如何做到这一点?也欢迎对我的代码进行任何改进。
提前致谢:)
事实证明,这很简单。发布这个以防有人遇到类似问题。仍然欢迎任何更正和改进。
这就是为我做的:
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))
这似乎仍然不是万无一失的方法,因为光标的位置可以改变,但到目前为止它似乎有效。