Я новичок в 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)
Если честно, я понятия не имею, как получить вход в окно проклятий. Заранее спасибо!