Das Fluchmodul von Python aktualisiert das Pad erst, wenn das erste Zeichen empfangen wurde

8

Ich habe den folgenden Code, mit dem Sie einen Textblock nach oben und unten scrollen können. Bei jedem Scrollen (d. H. Mit einer Benutzereingabe) wird das Pad wie erwartet aktualisiert. Bevor jedoch die erste Taste gedrückt wird, wird nichts angezeigt, obwohl ich pad.refresh () genauso wie nach jeder Benutzereingabe anrufe.

Mein Code sieht so aus:

%Vor%

Bearbeiten: Änderungen, die im Code angezeigt werden, was versucht wurde (+, ++, -)

    
felix001 12.08.2014, 15:38
quelle

3 Antworten

0

Versuchen Sie, stdscr.nodelay(1) aufzurufen, BEVOR Sie auf stdscr.getch() auflegen.

    
mp_ 10.10.2014, 16:03
quelle
6

Es scheint die (AFAIK undokumentierte) Notwendigkeit zu sein, den stdscr einmal zu aktualisieren, d. h. Aufruf stdscr.refresh() , bevor alles wie erwartet funktioniert. Ich habe das in dein Beispiel eingebaut (was ich vorher überhaupt machen musste - siehe unten):

%Vor%

Ich hoffe, das löst dein Problem!

Einige Anmerkungen:

  • Für die Zukunft empfehle ich Ihnen, die curses.wrapper(main) -Funktion zu verwenden, die die curses-Umgebung einrichtet und Ihre main(stdscr) -Methode mit dem Parameter stdscr as aufruft. Es sorgt auch dafür, dass Verwünschungen angemessen beseitigt werden, was ein defektes Terminal verhindert, wenn in Ihrem Code etwas schief geht. Vielleicht möchten Sie das hilfreiche Tutorial von Kuchling und Raymond zur Verwendung des Python Fluch Paket.

  • Geben Sie ein reproduzierbares Beispiel an. Dein enthält Variablen wie self.all_result , wo ich Vermutungen anstellen musste, um deine Frage zu verstehen. Tatsächlich habe ich mehr Zeit damit verbracht herauszufinden, was dein Code genau zu erreichen versucht, und das von dir beschriebene fehlerhafte Verhalten zu reproduzieren, als die tatsächliche Lösung zu finden.

Wenn Sie Ihre Frage bearbeiten, um sie auf das eigentliche Problem zu reduzieren - ich denke, sie könnte für viele Leute, die Pythons Fluchmodul verwenden, sehr hilfreich sein.

Danke & amp; Happy Hacken;)

Bearbeiten: Ich habe gerade festgestellt, dass Sie eine Bounty für eine Antwort aus offiziellen Quellen angeboten haben, also habe ich ein bisschen mehr gegraben und eine äquivalente Antwort auf SO , die auch darauf hindeutet, dass dies - nennen wir it bug - ist bisher undokumentiert. Meine beste Vermutung für den Grund, dass einige libncurses Forschung tun, wäre, dass die curses.wrapper in meinem Fall, Sie manuell, oder sogar libnurses selbst genannt ein löschen Bildschirmmethode zu jedem Zeitpunkt während der Initialisierung. Daher könnte das Lösch-Flag gesetzt sein, das folglich den Bildschirm bei der ersten Aktualisierung anstelle des erwarteten Verhaltens löscht.

    
jan.vogt 10.10.2014 18:38
quelle
0

stdscr.getch() bewirkt eine implizite Aktualisierung von stdscr (vorher nicht aktualisiert), wodurch pad vom Bildschirm gelöscht wird, indem es mit dem Leerzeichen stdscr überschrieben wird. Probieren Sie pad.getch() aus oder aktualisieren Sie stdscr vor dem ersten pad.refresh() .

    
William McBrine 12.08.2014 23:19
quelle

Tags und Links