python - 如何使用 urwid 和 asyncio 创建异步程序?

标签 python python-3.x event-loop urwid

我想用 aiortc 建立一个聊天室。首先,我想用 urwid 作为 cli 和 asyncio 构建一个模型。 urwid 部分已经运行良好,可以进行用户输入。我知道想要运行一个协程来生成随机文本并作为聊天客户端在该聊天室中发短信。

我尝试使用主循环作为异步协程运行我的 urwid 函数,但没有成功。 我不知道如何将异步函数集成到我的 urwid 主循环中。

def unhandled(key):
    """
    functin to handle input
    """
    global TEXT_INPUT
    global lw_user_input
    global lw_chatroom
    global listbox_chatroom

    if not isinstance(key, tuple):
        if key == 'enter':
            del lw_user_input[-1]
            # create widegt and fill with user input
            lw_chatroom.append(widget)
            TEXT_INPUT = ""
            listbox_chatroom.set_focus(len(lw_chatroom)-1, 'above')

        elif key == 'esc':
            raise urwid.ExitMainLoop()
        elif key == 'backspace':
            if len(lw_user_input) > 0:
                user_input = lw_user_input[0].get_text()[0]
                user_input = user_input[:-1]
                del lw_user_input[-1]
                TEXT_INPUT = user_input
                lw_user_input.append(urwid.Text(TEXT_INPUT))
        else:
            TEXT_INPUT += key  # repr(key)
            if len(lw_user_input) > 0:
                del lw_user_input[-1]
                lw_user_input.append(urwid.Text(TEXT_INPUT))
            else:
                lw_user_input.append(urwid.Text(key))



def generate_output():
    global lw_chatroom
    global listbox_chatroom
    while True:
        # generate text and widgets and post with delay
        lw_chatroom.append(chat_widget)
        listbox_chatroom.set_focus(len(lw_chatroom)-1, 'above')


def create_cli():
    # generate all widgets
    uloop = urwid.MainLoop(frame, palette, screen,
                           unhandled_input=unhandled)
    uloop.start()


if __name__ == '__main__':
    create_cli()

我想异步运行generate_output()和unhandled(key)。我不知道该怎么做。

最佳答案

好吧,我明白了。

就这么简单:

aloop = asyncio.get_event_loop()

ev_loop = urwid.AsyncioEventLoop(loop=aloop)
loop = urwid.MainLoop(frame, palette, screen,
                      unhandled_input=unhandled, event_loop=ev_loop)
aloop.create_task(generate_output())
loop.run()

关于python - 如何使用 urwid 和 asyncio 创建异步程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56966547/

相关文章:

python - 如何在python中使用模拟数据创建数据框

javascript - 如何正确使用Xpath通过scrapy抓取AJAX数据?

python - 如何从原始(二进制)ctype 缓冲区构建 python 字符串?

javascript - 为什么setTimeout(fn,0)有时有用?

javascript - 为什么 setTimeout(0) 和 setImmediate() 的行为在主模块中使用时未定义?

python - 如何在 Luigi 中使用早期任务的输出?

python - 从/usr/bin/* 执行命令时,来自 subprocess.run 的 FileNotFoundError - Python

sockets - Python 3.x socket.error : [Errno 10013] An attempt was made to access a socket in a way forbidden by its access permissions

python-3.x - 用于从 youtube 下载 MP3 文件的 Python 库

c++ - Gtkmm:稍后添加窗口