Seite 1 von 1

keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 13:30
von Francesco
Hallo, wie bekomme ich
a) in Windows
b) in Linux

ein KeyEvent, ohne dabei das Programm zu blockieren:

Code: Alles auswählen

while 1:
   print "key=" getkey()
Wenn kein key gedrückt wurde, sollte dann einfach "key=" stehen. raw_input und so weiter verlangen ja alle, dass etwas mit enter abgeschlossen ist.
in Linux: sys.stdin.read(1) wartet ebenfalls so lange, bis es mit enter quittiert wurde.

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 13:36
von Hyperion
Mit pygame geht so etwas.

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 13:41
von Francesco
Hyperion hat geschrieben:Mit pygame geht so etwas.
Danke für die prompte Antwort. Das verstehe ich nicht, dass so eine einfache Sache nicht einfach in Python drin ist. Vielleicht geht das vom Betriebssystem selbst nicht so leicht? dass die nur dann den Tastaturpuffer weitergeben, wenn ein Return gedrückt wurde.

Ich möchte das in einem einfachen Konsolenprogramm drin haben.
pseudocode:

Code: Alles auswählen

while 1:
    dosomethingveryoften()
    if mygetkeypress().lower() in ["qx"]:
        print "quit"
        break
Auch wenns andere Lösungen für das Abbrechen geben würde, würde mich diese spezielle Lösung jetzt interessieren.

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 13:43
von Hyperion
K.A. Du kannst Dir ansonsten auch mal curses und die div darauf aufbauenden Libs angucken. Evtl. können die so etwas auch. Andererseits weiß ich nicht, wie es da mit der Portabilität aussieht.

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 13:58
von BlackJack
@Francesco: Wie Du schon richtig vermutest ist diese "einfache" Sache nicht wirklich einfach. Das hängt vom Betriebssystem ab und dort auch von wo man die Eingabe bekommen möchte -- Terminal, Fenstermanager, direkt aus dem Tastaturpuffer… Portabel ist das nicht so einfach zu lösen. Eine standardisierte Schnittstelle gibt's wohl nicht wirklich.

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 14:09
von Francesco
BlackJack hat geschrieben:@Francesco: Wie Du schon richtig vermutest ist diese "einfache" Sache nicht wirklich einfach. Das hängt vom Betriebssystem ab und dort auch von wo man die Eingabe bekommen möchte -- Terminal, Fenstermanager, direkt aus dem Tastaturpuffer… Portabel ist das nicht so einfach zu lösen. Eine standardisierte Schnittstelle gibt's wohl nicht wirklich.
@BlackJack: Schade, mich hats ja auch schon gewundert, warum im google so schwer was zu finden ist. Ich frage mich: Wie breche ich das Programm sonst elegant ab? Es soll einfach dann abgebrochen werden, wenn der User es nicht mehr braucht. Ctrl-C geht mir aber gegen den Strich. ;)

Gut, portabel: man könnte beide Varianten in einem Programm probieren. if windows platform, sonst gtk (vielleicht auch noch osx). Im Windows gibts doch dieses kbhit (oder getchar) von msvcrtd (falls ich mich richtig erinnert habe), das dann immer was zurückgibt. Meist halt ''. ;)

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 14:14
von Hyperion
Francesco hat geschrieben: @BlackJack:Ich frage mich: Wie breche ich das Programm sonst elegant ab? Es soll einfach dann abgebrochen werden, wenn der User es nicht mehr braucht. Ctrl-C geht mir aber gegen den Strich. ;)
Wieso das? Ist das nicht eine durchaus übliche Kombi?

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 14:37
von Francesco
Hyperion hat geschrieben:
Francesco hat geschrieben: Wieso das? Ist das nicht eine durchaus übliche Kombi?
Weil Ctrl-C ist abwürgen. Es kann ja sein, dass eine Fileoperation gerade im Gang ist. Es sollte "sanft" ausgestiegen werden. ;)

Es geht um mein Quick und Dirty Programm:
http://pastebin.com/g9QaFZa2

(das sich aus dem thread => http://www.python-forum.de/viewtopic.php?f=5&t=23753 ergeben hat)

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 14:44
von Hyperion
Francesco hat geschrieben:
Hyperion hat geschrieben:
Francesco hat geschrieben: Wieso das? Ist das nicht eine durchaus übliche Kombi?
Weil Ctrl-C ist abwürgen. Es kann ja sein, dass eine Fileoperation gerade im Gang ist. Es sollte "sanft" ausgestiegen werden. ;)
Kann man das nicht mit einem KeyboardInterrupt abfangen? Oder ist das auch OS abhängig?

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 14:57
von Francesco
Hyperion hat geschrieben: Kann man das nicht mit einem KeyboardInterrupt abfangen? Oder ist das auch OS abhängig?
Das würde aber genau so mittendrin aussteigen, denke ich. Ich mein so tragisch ist das bei dieser Anwendung eh nicht (wenn das letzte Bild nicht mehr richtig gespeichert wird), aber stören tuts mich schon, warum man nicht auf einen Tastendruck abfragen kann, ohne gleich wieder mit dem curses modul hantieren zu müssen.

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 17:44
von Leonidas
Francesco hat geschrieben:
Hyperion hat geschrieben: Kann man das nicht mit einem KeyboardInterrupt abfangen? Oder ist das auch OS abhängig?
Das würde aber genau so mittendrin aussteigen, denke ich.
Hu? Dann musst du halt im KeyboardInterrupt ein brauchbares Handling einbauen. Du kannst sogar C-c ignorieren wenn du willst. Insofern verstehe ich unter "Abwürgen" eher was anderes.

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 18:36
von noisefloor
Hallo,

geht das nicht über Threads? Also eine Thread, der Arbeitet und eine, der periodisch einen Tastaturbefehl abfragt...

Habe Threads selber nochnie benutzt, daher weiß ich nicht, wie abwegig mein Vorschlag ist... ;-)

Gruß, noisefloor

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 18:47
von BlackJack
@noisefloor: Und wie fragst Du periodisch eine Taste ab? Plattformunabhängig! *Das* ist hier die Frage.

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 19:49
von noisefloor
Hallo,
BlackJack hat geschrieben:*Das* ist hier die Frage.
Nee, das ist eine von 2 Fragen - siehe 1. Post vom OP. :-)

Gruß, noisefloor

Re: keypress event bekommen - nicht blockieren

Verfasst: Samstag 14. August 2010, 20:00
von BlackJack
@noisefloor: Ich gebe zu das "nicht blockierend" nicht noch einmal geschrieben zu haben, aber es bleibt *eine* Frage.