Я нахожусь в процессе написания серверного приложения на Python3 для обработки и управления несколькими клиентскими подключениями одновременно. Мне нужно иметь возможность отправлять данные клиентам, а также мгновенно распечатывать все, что они отправляют, и любую информацию из моей программы. Большинство ответов на SO относительно этого рекомендуют использовать 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. Я предполагаю, что это будет просто связано с поиском строки и вставкой новой над ней. Может ли кто-нибудь привести пример того, как это можно сделать? Любые улучшения в моем коде также приветствуются.
Заранее спасибо:)