Python / verflucht Benutzereingaben beim Aktualisieren des Bildschirms

Ich programmiere gerade eine App U.I mit Python / Curses und habe mich gefragt, ob es möglich ist, den Benutzer aufzufordern, Tasten zu drücken (Cbreak-Modus), um einige Bedienfelder oder Fenster auszublenden oder anzuzeigen, während die U.I kontinuierlich aktualisiert wird.

Ich habe die offiziellen Python-Dokumente über Flüche gelesen und einige Versuche unternommen, aber auch wenn der cbreak-Modus und der nicht blockierende Eingabemodus (Nodelay) aktiviert sind, kann ich nicht dafür sorgen, dass er ordnungsgemäß funktioniert (es gelingt mir jedoch, Benutzereingaben zu erhalten auf Kosten der Sperrung der Benutzeroberfläche ist das nicht das, was ich will).

So ist meine Frage einfach, ist es möglich? Und wenn ja, wie?

Ich habe die Dokumente möglicherweise falsch gelesen, aber ich habe keine alternativen Dokumente oder Beispiele dazu gefunden.

Ich habe darüber nachgedacht, die App multithreaded zu machen, aber ich habe nicht gesehen, wie mir dies in diesem Fall helfen kann.

Vielen Dank für Ihre Hilfe, Ratschläge oder Hinweise auf ein detailliertes Dokument.

EDIT:

Ich habe schließlich den folgenden Multithread-Code erhalten, der jedoch nicht zufriedenstellend ist. Das U.I wird so gespeist, wie es sein muss, aber nach dem Aktualisieren wird das Display gespalten.

Ich verstehe auch nicht, warum curses.panel.hidden () False zurückgibt, während das betreffende Panel ausgeblendet ist. Es sieht so aus, als würde beim Aktualisieren des Fensters, das mit dem Bedienfeld verknüpft ist, das Bedienfeld oder ähnliches ausgeblendet. Ich bin an diesem Punkt wirklich verloren!

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()

Antworten auf die Frage(1)

Ihre Antwort auf die Frage