Tasten mit Curses auslesen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Chasey
User
Beiträge: 2
Registriert: Samstag 25. November 2017, 10:09

Samstag 25. November 2017, 11:15

Hallo,

ich hab das Problem, wenn ich tasten mit sdtscr.getch abfrage, dass ich es dann nicht schaffe es so zu programmieren, dass egal wie lange ich die Taste drücke es nur als ein druck gewertet wird.

Vielen Dank!
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Montag 27. November 2017, 19:11

Da keiner Antwortet will ich mal meine Vermutung äußern: Ich vermute es geht nicht.

Bei GUI Toolkits kann man meist auf Key_down, Key_up events reagieren, das scheint bei curses zu fehlen. Und der Key wird dann mit der Anschalgsverzögerung des Betriebsystems? wiederholt.
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Montag 27. November 2017, 22:11

Wenn ich das Problem richtig verstanden habe, dann suchst du wahrscheinlich sowas:

Code: Alles auswählen

def get_unique_items(getter):
    last_seen = object()
    while True:
        item = getter()
        if item != last_seen:
            last_seen = item
            yield last_seen
Habe hier mal eine abstrakte Form gewählt, weil man das natürlich auch für andere Dinge als nur für getch() benutzen kann. Der zu übergebende getter wäre hier halt getch().

Alternativ übrigens auch mit groupby() machbar:

Code: Alles auswählen

from itertools import count, groupby

def get_unique_items(getter):
    items = (getter() for _ in count())
    return (key for key, group in groupby(items))
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 28. November 2017, 01:22

Oder in einem Rutsch:

Code: Alles auswählen

unique_items = (
    key for key, group in groupby(iter(getter, object()))
)
Der Einsatz von object() dient übrigens dazu, eine Abbruchbedingung zu haben, die niemals erfüllt wird, ergo: eine Endlosschleife (iter() verhält sich in dieser Form wie ein while not). Durch den Einsatz eines Generators (die äußeren runden Klammern) ist es aber trotzdem möglich, eine begrenzte Menge an Elementen aus dieser Schleife zu holen, z.B. via islice().
shcol (Repo | Doc | PyPi)
Antworten