Одновременный ввод и вывод с использованием urwid - PullRequest
0 голосов
/ 08 мая 2019

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

Заранее спасибо:)

1 Ответ

0 голосов
/ 10 мая 2019

Как оказалось, все довольно просто. Размещать это в случае, если у кого-то есть подобная проблема Любые исправления и улучшения все еще приветствуются.

Вот что сделал для меня:

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))

Это все еще не похоже на надежный метод, поскольку положение курсора может измениться, но, похоже, оно работает до сих пор.

...