Python ncurses: Zeigt nicht den Bildschirm bis zum ersten Tastendruck an, obwohl Refresh zuerst ist

Der untenstehende Code lässt Sie ein kleines Raster auf dem Bildschirm mit den Pfeiltasten, die "." Wo du erlebt hast oder weiter Auch wenn ich meine Auffrischung vor dem ersten Gramm habe (um einen Schlüsselloch zu bekommen), zeigt der Bildschirm erst dann nichts an, wenn du deine Ausgangsposition weggezogen hast. Sollte nicht die addstr gefolgt von Auffrischung sofort zeigen und dann wartet das getch danach? Ich habe sogar versucht, ein stdscr.refresh () hinzuzufügen, aber das half auch nicht. Wie bekomme ich den Bildschirm sofort zu aktualisieren, bevor ich auf den ersten Schlagstich warte?

import curses def start(stdscr): curses.curs_set(0) movement = curses.newpad(10, 10) cur_x, cur_y = 5, 5 while True: movement.addstr(cur_y, cur_x, '@') for (x_off, y_off) in [(-1,0),(1,0),(0,-1),(0,1)]: movement.addstr(cur_y + y_off, cur_x + x_off, '.') movement.refresh(1, 1, 0, 0, 7, 7) #Nothing is displayed until after the first key-stroke key_stroke = stdscr.getch() move_attempt = False if 0 < key_stroke < 256: key_stroke = chr(key_stroke) elif key_stroke == curses.KEY_UP and cur_y > 1: cur_y -= 1 elif key_stroke == curses.KEY_DOWN and cur_y < 8: cur_y += 1 elif key_stroke == curses.KEY_LEFT and cur_x > 1: cur_x -= 1 elif key_stroke == curses.KEY_RIGHT and cur_x < 8: cur_x += 1 else: pass if __name__ == '__main__': curses.wrapper(start) 

  • Python curses remote debugging pdevd fehler in setupterm
  • Curses-like Bibliothek für Cross-Plattform-Konsole App in Python
  • Python flucht nicht Farben, während C ncurses funktioniert gut
  • Mit fluchen mit raw_input in python
  • Wie man ein Wort in ncurses Bildschirm eingeben?
  • Bearbeiten von Text mit Python und Curses Textbox Widget?
  • Wie kann man eine Datei mit Python aufheben
  • Python: Herunterladen und Entpacken einer ZIP-Datei ohne auf Festplatte zu schreiben
  • Wie entpackst du sehr große Dateien in Python?
  • Überprüfen Sie, ob ein Verzeichnis in einer Zip-Datei mit Python existiert
  • Entpacken der Verzeichnisstruktur mit Python
  • Transponieren / Entpacken Funktion (invers Zip)?
  • 3 Solutions collect form web for “Python ncurses: Zeigt nicht den Bildschirm bis zum ersten Tastendruck an, obwohl Refresh zuerst ist”

    Die docs sind kaputt Ich habe Fluch zurück in den Tag, aber libncurses ist neu für mich.

    Mein erster Hinweis kam von ncurses (3) :

    Die ncurses-Bibliothek erlaubt die Manipulation von Datenstrukturen, sogenannten Fenstern, die als zweidimensionale Arrays von Zeichen betrachtet werden können, die alle oder einen Teil eines CRT-Bildschirms darstellen. Ein Standardfenster mit dem Namen stdscr, welches die Größe des Terminalbildschirms ist, wird geliefert. Andere können mit newwin erstellt werden. … Spezielle Fenster, die Pads genannt werden, können auch manipuliert werden. Dies sind Fenster, die nicht auf die Größe des Bildschirms beschränkt sind und deren Inhalt nicht vollständig angezeigt werden muss.

    Aber dann erfrischend (3) wurde entschieden ausweichend:

    Die Routine-Wirefresh arbeitet, indem sie zuerst wnoutrefresh aufruft, das das benannte Fenster auf den virtuellen Bildschirm kopiert und dann dopdate aufruft, das den virtuellen Bildschirm mit dem physikalischen Bildschirm vergleicht und die eigentliche Aktualisierung durchführt. … Die Phrase "kopiert das benannte Fenster auf den virtuellen Bildschirm" oben ist zweideutig. Was tatsächlich passiert, ist, dass alle berührten (geänderten) Zeilen im Fenster auf den virtuellen Bildschirm kopiert werden. Dies betrifft Programme, die überlappende Fenster verwenden. Es bedeutet, dass, wenn zwei Fenster überlappen, können Sie sie in jeder Reihenfolge aktualisieren und die Überlappungsregion wird nur geändert, wenn es explizit geändert wird. [Betonung meiner)

    Was mich dazu veranlasste, hinzuzufügen

     stdscr.refresh() 

    Nach deinem pad.refresh() was gearbeitet hat. Und dann habe ich es weiter nach oben start() zu sehen, ob es wirklich auf jede Pad-Modifikation benötigt wurde. Ich zog es den ganzen Weg bis zum ersten Punkt gibt es ein stdscr zu arbeiten mit Nachgeben:

     def start(stdscr): stdscr.refresh() curses.curs_set(0) … 

    Das schlägt der Voodoo-Programmierung, aber ich werde nicht auf die Innereien einer 20-jährigen Bibliothek blicken, die mit Glas ttys fertig ist, um zu versuchen, es zu kauen.

    stdscr.refresh() irgendwann vor der movement.refresh() , um das Problem zu lösen.

    Durch das Hinzufügen von time.sleep(1) nach der Refresh-Anweisung, schreibt es auf den Bildschirm, aber dann verschwindet es, wenn stdscr.getch() aufgerufen wird, aber nur das erste Mal. Wahrscheinlich hat man mit einer Art verzögerter Initialisierung von stdscr zu tun.

    Aufruf von stdscr.refresh() nach der stdscr.refresh() hat die gleiche Wirkung: Das allererste Mal durch die Schleife stdscr.refresh() löscht den Bildschirm, aber nicht in nachfolgenden Zeiten durch die Schleife. Durch das Aufrufen von stdscr.refresh() früh im Programm wird es dieses seltsame erste Mal erfrischen aus dem Weg.

    Bei der Verwendung eines Pad, aus irgendeinem Grund – ich weiß nicht warum – du musst curses.doupdate nachdem du die Auflage curses.doupdate hast.

    Python ist die beste Programmiersprache der Welt.