Как я могу написать функцию асинхронного ввода для моего макета чата? - PullRequest
0 голосов
/ 23 июня 2019

Я новичок в asyncio, aioconsole и curses.Я пишу макет для чата, который должен работать с aiortc.Я хочу издеваться над p2p-соединениями между всеми клиентами в чате.Я создал cli с помощью curses и сейчас пытаюсь написать асинхронную функцию ввода для пользовательского ввода.Как я могу интегрировать вход aioconsole в окно curses?

Я включил классы evchat для cli.(https://github.com/EvanKuhn/evchat/tree/master/evchat) Я также реализовал процедуру «производитель / потребитель», которая генерирует случайный вывод и выводит его на консоль. В общем, он имитирует активный чат между несколькими людьми. Без ввода пользователя программа работает, как и ожидалось. Она генерируетслучайная история чата просто без ввода пользователя.


import os
import json
import datetime
import asyncio
from aioconsole import ainput
import sys
import random
import curses
import ui

from loremipsum import get_sentence

class Prompt:
    """
    #==============================================================
    # The Prompt class prompts the user for text.
    #==============================================================
    """
    def __init__(self, layout, screen):
        self.layout = layout
        self.screen = screen
        self.window = curses.newwin(layout.prompt_rows, 
                      layout.prompt_cols,
                      layout.prompt_start_row, layout.prompt_start_col)
        self.window.keypad(1)
        self.window.addstr('> ')

    def getstr(self):
        "Get an input string from the user"
        return self.window.getstr()

    # ... more functions, more classes


class Message:
    """
    #================================================================
    # Message class
    #================================================================
    """
    def __init__(self, time=None, name=None, text=None):
        self.time = time
        self.name = name
        self.text = tex


class ChatApp:
    """
    #========================================================== 
    # The ChatApp class is contains all lower-level UI classes, plus 
    the main
    # runtime loop.
    #==================================================================
    """
    running = False

    def __init__(self, config, arguments):
        self.config = config
        self.layout = ui.Layout()
        self.args = arguments
        self.screen = None

    # ...more functions

    async def generate_output(self, queue: asyncio.Queue):
        """
        generates random output for mockup purposes, 
        the producer
        """
        name_list = ["Sepp", "Schorsch", "Hansi", "Hildegard", "Vreni"]
        time_delay = random.uniform(0.1, 2)
        rand_name = random.randint(0, 4)
        now = datetime.datetime.now()
        randtext = Message(now, name_list[rand_name], 
                           str(get_sentence(True)))
        # self.history.append(randtext)
        await asyncio.sleep(time_delay)
        await queue.put(randtext)

    async def user_input(self, queue: asyncio.Queue):
        """
        getting user_input
        the producer
        """
        # Get input
        # text = self.prompt.getstr()
        text = asyncio.wait_for(self.prompt.getstr(), timeout=1)
        # Construct and store a Message object
        now = datetime.datetime.now()
        msg = Message(now, self.config.name, text)
        await asyncio.wait_for(queue.put(msg), timeout=0.1)

    async def write_to_console(self, queue: asyncio.Queue):
        """
        coroutine for writing to console, 
        the consumer
        """
        while True:
            msg = await queue.get()
            self.history.append(msg)
            queue.task_done()


if __name__ == "__main__":
    app = ChatApp(conf, args)
    loop = asyncio.get_event_loop()
    try:
        task = loop.create_task(app.start())
        loop.run_until_complete(task)
    except KeyboardInterrupt:
        app.stop()

Я ожидаю, что Sepp & Co. будет писать случайные предложения ipsum через случайные интервалы без ввода данных пользователем, мешая участникам чата писать что-то. Как в WhatsApp или как-то ещеГруппа чата. На данный момент я получаю только это: я пишу что-то в чат. Только один человек отвечает, и все ждут другого ввода от пользователя.

, что не помогло, это было вКласс подсказок:


async def getstr(self):
    "Get an input string from the user"
    text = await self.window.getstr()
    return text

или:


async def getstr(self):
    "Get an input string from the user"
    text = await ainput()
    self.window.addstr(text)

Если честно, я понятия не имею, как получить вход в окно проклятий. Заранее спасибо!

1 Ответ

0 голосов
/ 25 июня 2019

Вместо getstr вы можете создать свою собственную функцию, используя getch , с коротким тайм-аутом (или с nodelay set) .

...