import curses import asyncio import sys class Console(): def __init__(self): self.stdscr = curses.initscr() def __enter__(self): curses.noecho() curses.cbreak() self.stdscr.keypad(True) return self def __exit__(self, *_): curses.nocbreak() self.stdscr.keypad(False) curses.echo() curses.endwin() async def start(c, on_str, on_tab, messages): string = "" redraw(c.stdscr, messages) while True: char = await asyncio.to_thread(c.stdscr.getkey) if char == '\n' and string != "": await on_str(string) messages.append(string) redraw(c.stdscr, messages) string = "" elif char == '\t': await on_tab() else: string += char def redraw(stdscr, messages): stdscr.clear() for msg in messages: stdscr.addstr(msg + '\n') stdscr.refresh()