Python / maldice la entrada del usuario mientras actualiza la pantalla

Actualmente estoy codificando una aplicación U.I con python / curses y me preguntaba si es posible pedirle al usuario que presione las teclas (modo de interrupción) para ocultar o mostrar algunos paneles o ventanas mientras la U.I se actualiza continuamente.

Leí los documentos oficiales de Python sobre maldiciones e hice algunos intentos, pero incluso con el uso del modo cbreak y el modo de entrada sin bloqueo (nodelay) activado, no puedo hacer que funcione correctamente (logré obtener la entrada del usuario, pero en el costo de bloquear la interfaz de usuario que no es lo que quiero).

Entonces mi pregunta es simple, ¿es posible? Y si es así, ¿cómo?

Es posible que haya leído mal los documentos, pero no he encontrado ningún documento alternativo o ejemplo al respecto.

Pensé en hacer que la aplicación tuviera varios subprocesos, pero no vi cómo esto me puede ayudar en este caso.

Gracias por su ayuda, consejos o puntero a un documento detallado.

EDITAR:

Finalmente terminé con el siguiente código multiproceso, pero no es satisfactorio. La U.I se alimenta como debe ser, pero después de actualizar la pantalla se descorcha.

Tampoco entiendo por qué curses.panel.hidden () devuelve False mientras el panel considerado está oculto. Parece que actualizar la ventana asociada con el panel muestra el panel o algo así. Estoy realmente perdido en este punto!

import threading
import curses, curses.panel
import random
import time

gui = None

class ui:
    def __init__(self):
        self.feeder = feeder(self)
        self.stdscr = curses.initscr()
        curses.noecho()
        curses.cbreak()
        curses.curs_set(0)
        self.stdscr.keypad(1)

        self.win1 = curses.newwin(10, 50, 0, 0)    
        self.win1.border(0)
        self.pan1 = curses.panel.new_panel(self.win1)
        self.win2 = curses.newwin(10, 50, 0, 0)    
        self.win2.border(0)
        self.pan2 = curses.panel.new_panel(self.win2)
        self.win3 = curses.newwin(10, 50, 12, 0)
        self.win3.border(0)
        self.pan3 = curses.panel.new_panel(self.win3)

        self.win1.addstr(1, 1, "Window 1")
        self.win2.addstr(1, 1, "Window 2")
        self.win3.addstr(1, 1, "Press 's' to switch windows or 'q' to quit.")


        self.pan1.hide()
        self.win1.refresh()

        curses.panel.update_panels()
        self.win2.refresh()
        self.feeder.start()


    def ask(self):
        while True:
            self.win3.addstr(5,1, "Hidden = win1: "+str(self.pan1.hidden())+\
                             "win2:"+str(self.pan2.hidden()), 0)
            self.win3.refresh()
            k = self.win3.getkey()
            if k == 's':
                if self.pan1.hidden():
                    self.pan2.hide()
                    self.pan1.show()
                    self.win1.refresh()
                    self.win3.addstr(2, 1, "Pan1 restored")
                else:
                    self.pan1.hide()
                    self.pan2.show()
                    self.win2.refresh()
                    self.win3.addstr(2, 1, "Pan2 restored")
                self.win3.addstr(5,1, "Hidden = win1: "+\
                                 str(self.pan1.hidden())+\
                                 " win2:"+str(self.pan2.hidden()), 0)

            elif  k == 'q':
                break        
        self.quit_ui()

    def quit_ui(self):
        self.feeder.stop()
        curses.nocbreak()
        self.stdscr.keypad(0)
        curses.curs_set(1)
        curses.echo()
        curses.endwin()
        exit(0)

    def display_data(self, window, data):
        window.addstr(3, 1, data, 0)



class feeder(threading.Thread):
    # Fake U.I feeder
    def __init__(self, ui):
        super(feeder, self).__init__()
        self.running = False
        self.ui = ui
        self.count = 0

    def stop(self):
        self.running = False

    def run(self):
        self.running = True
        self.feed()

    def feed(self):
        while self.running:
            self.ui.win1.addstr(3, 1, str(self.count)+\
                                ": "+str(int(round(random.random()*9999))))
            self.ui.win1.addstr(4, 1, str(self.running))
            self.ui.win2.addstr(3, 1, str(self.count)+\
                                ": "+str(int(round(random.random()*9999))))
            self.ui.win2.addstr(4, 1, str(self.running))
            time.sleep(0.5)
            self.count += 1


if __name__ == "__main__":
    gui = ui()
    gui.ask()

Respuestas a la pregunta(1)

Su respuesta a la pregunta