ubuntuusers.de

Tastaturabfrage in Python mit curses

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Chasey

Anmeldungsdatum:
25. November 2017

Beiträge: Zähle...

Hallo,

Mein aktuelles Projekt ist eine Registrierkasse mit einem Raspberry Pi. Dazu muss ich von einem USB-Nummernblock Tastenbefehle abfragen. Das hab ich mit stdscr.getch von der Curses-Bibliothek auch gut hinbekommen. Solange man jede Taste nur kurz drückt ist alles Perfekt. Wir aber eine Taste einmal (zB ausversehen) etwas zu lange gedrücht (ca > 1s) macht das Programm unschöne Dinge, wie zB, dass wenn eine Bestellung mit Enter bestätigt wird sich gleich die Kassenschublade öffnet, die eigentlich erst beim zweiten Enter (wenn der Kunde Geld gegeben hat) aufgehen soll.

Meine Überlegungen gingen bisher in die Richtung, dass ich auf das Loslassen der Taste reagiere. Das Problem daran ist das das Tastensignel "flattert", das heißt immer wieder zwischen Tastenwert und 0 wechselt.

Hat jemand ne Idee wie man entweder das Signal "glätten" kann?

Wenn jemand eine komplett andere Idee hat wie ich das Problem lösen kann bin ich darüber natürlich auch dankbar!

Schon mal vielen Dank im Voraus!!!

Mooi

Anmeldungsdatum:
15. August 2014

Beiträge: 187

Ich kenne mich zwar nicht in Python aus, kenne das Problem aber aus der Spieleprogrammierung (in Basic [nur noch für alte Säcke 😀 ]): Wird etwas per Tastatur ausgelöst, springt das Programm danach in ein Unterprogramm, das den gesamten Tastaturpuffer löscht. Erst danach wird ins Hauptprogramm (oder wohin auch immer) zurück gesprungen.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

@Chasey: Das dürfte die ganz normale Tastenwiederholung sein. Kannst ja einfach mal eine Taste im Terminal oder in einem Editor gedrückt halten; da gibt es eine kleine Pause und dann wiederholt sich die Taste solange bis man sie wieder los lässt.

Entweder schaltest Du das global ab, oder findest heraus ob und wie man das für ein einzelnes Programm machen kann, oder Du verwendest eine andere, niedrigere API als curses. Zum Beispiel Pygame. Da kannst Du separat auf den Tastendruck und das loslassen der Taste reagieren.

Chasey

(Themenstarter)

Anmeldungsdatum:
25. November 2017

Beiträge: 3

@Mooni so hab ich auch schon gedacht... aber ich hab keine Ahnung wie ich den Tastaurpuffer leeren kann.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

@Chasey: Der Tastaturpuffer ist nicht das Problem, denn wenn Du in curses die Zeichen direkt verarbeitest, dann kommen die nicht wirklich aus dem Tastaturpuffer, es sei denn Du brauchst (aus Rechnersicht) sehr lange um jede einzelne Taste zu verarbeiten. Das Problem ist das diese Tastendrücke tatsächlich existieren weil die durch die eingestellte Tastenwiederholung erzeugt werden. Statt die nachträglich raus zu filtern, was schwierig bis unmöglich sein wird, sollte man sie gar nicht erst erzeugen. Oder eben auf einer niedrigeren Ebene als der Terminalemulation auf die Tastenereignisse zugreifen.

Chasey

(Themenstarter)

Anmeldungsdatum:
25. November 2017

Beiträge: 3

Marc_BlackJack_Rintsch schrieb: Statt die nachträglich raus zu filtern, was schwierig bis unmöglich sein wird, sollte man sie gar nicht erst erzeugen. Oder eben auf einer niedrigeren Ebene als der Terminalemulation auf die Tastenereignisse zugreifen.

ok... gar nicht erst erzeugen wird schwierig weil ich nicht in der Hand hab wie lange der Nutzer auf den Tasten herum drückt...

die niedrigere Ebene wäre PyGame, oder?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4695

Wohnort: Berlin

@Chasey: Die Frage ist nicht ob Du den Benutzer kontrollieren kannst, sondern ob Du den Rechner soweit kontrollieren kannst, das der Treiber keine Tastenwiederholung macht. Das kommt ja nicht von der Hardware/Tastatur sondern je nach dem wie der Weg aussieht über den das Programm an die Tastendrücke kommt, vom Kernel oder vom X-Server und kann auch abgeschaltet werden. Bei X geht das beispielsweise mit dem xset-Programm.

Eine niedrigere Ebene wäre beispielsweise Pygame. Oder auch ein beliebiges GUI-Rahmenwerk das sowohl das drücken als auch das loslassen einer Taste meldet. Oder man kümmert sich selbst um die Scancodes von der Tastatur, was aber Arbeit macht und unter Umständen auch Probleme wenn man etwas falsch macht und deshalb die Tastatur nicht mehr benutzen kann. Siehe auch die Antwort von Andrew Edgecombe auf SO mit Links zu weiteren Quellen.

Antworten |