2016-08-03 12 views
0

Ich versuche, einen Weg zu finden, KeyDown und KeyUp Ereignisse in Python zu erhalten. Mit Pygame ist dies einfach mit pygame.KEYDOWN und pygame.KEYUP möglich, aber ich versuche, einen Weg zu finden, ohne eine GUI zu verwenden.Python-Tastaturereignisse ohne GUI (nicht blockierend)

Idealerweise würde ich in der Lage sein mag, eine Funktion isKeyDown(key), zu definieren, welche True wenn key zurückkehren würde zur Zeit gedrückt gehalten wird, oder False zurück, wenn dies nicht der Fall, aber so oder so, wäre es mit dem Code weitermachen (Es wäre nicht blockierend). Zum Beispiel:

while True: 
    if not isKeyDown("a"): #If 'a' isn't currently being pressed 
     print ("You are not pressing 'a'") 
    elif isKeyDown("a"): #If 'a' is being held down when this is run 
     print ("You are pressing 'a'") 
     print ("This is the end of this program") 
     break 

Ich habe msvcrt.getch() versucht, aber das hat zwei Probleme:

1) Es das Programm stoppt, bis etwas gedrückt wird, und

2) sie nicht wirklich sagen, Sie, wenn der Schlüssel gedrückt wird; es kehrt einfach zurück, wenn die Taste zu der Zeit gedrückt wird. Dies kann manchmal zusammenfallen, da Windows Tastenbetätigungen wiederholt, wenn sie gedrückt gehalten werden, aber es ist unwahrscheinlich, dass dies geschieht, wenn der while Loop mit maximaler Geschwindigkeit ausgeführt wird.

Ich habe auch msvcrt.kbhit(), aber es stellt sich auf 1, wenn eine Taste gedrückt wurde und nicht durch msvcrt.getch() gelesen, und damit läuft noch in die Probleme der msvcrt.getch() und kehrt nicht wirklich, ob ein Schlüssel tatsächlich ist wird derzeit niedergehalten.

Ich verwende Windows, so dass das curses Modul, das viele Leute verwendet haben, um ähnliche Fragen zu beantworten, nicht verfügbar ist.

Gibt es eine Möglichkeit, eine solche isKeyDown() Funktion in Windows ohne GUI zu definieren, vorzugsweise nur mit eingebauten Modulen? Wenn dies mit den integrierten Python-Modulen nicht möglich ist, sind Module von Drittanbietern in Ordnung, sofern sie keine GUI benötigen.

Auch mit Pygame oder Tkinter wäre in Ordnung, solange eine Möglichkeit, ihre GUIs zu deaktivieren.

Wenn dies nicht möglich ist, bitte sagen Sie mir, warum, damit ich aufhören kann, nach einer Lösung zu suchen (ich habe in den letzten Tagen versucht, etwas anderes zu tun).

Ich benutze Python 3.5.2 auf einem 64-Bit-Windows-10-Laptop.

+0

Bitte beziehen Sie sich auf diese Frage: http: //stackoverflow.com/questions/13564851/generate-keyboard-events –

+1

@GaurabDhama: Vollständig unabhängig. Diese Frage fragt, wie ** Eingang ** erhalten wird. Die Frage, die Sie verknüpft haben, erklärt, wie ** Eingaben generiert werden. – IInspectable

+1

@GauravDhama Ich habe mir diese Frage angeschaut, und es erklärt, wie _Tastaturereignisse _generiert werden, während ich nach Möglichkeiten suche, Tastaturereignisse als _inputs_ zu bekommen. – Sid

Antwort

0

Es sieht so aus, als ob Sie wollen pyhook bekommen. Ich glaube, es hängt von der pywin32 Bibliothek ab.

Grundsätzlich möchten Sie einen Keylogger erstellen. Dadurch erhalten Sie nicht blockierende Tastaturereignisse. Natürlich möchten Sie vielleicht die Win32 API verwenden, um sicherzustellen, dass beim Drücken der Taste Ihr Fenster im Fokus ist, wenn das für Sie wichtig ist.

Ich habe meine Windows-Box nicht zugänglich, oder ich könnte Ihnen mehr Codebeispiele geben, aber das sollte Sie zumindest in die richtige Richtung weisen.

+0

Es hat eine Weile gedauert, bis ich es implementiert habe, aber es hat erfolgreich funktioniert. Danke! Übrigens, wenn Sie einen Python-Befehl kennen, der den Windows-Schlüsselwiederholungsmechanismus ausschalten (und später wieder einschalten) kann, können Sie mir das bitte sagen? – Sid

+0

Ausgezeichnet! Ich bezweifle, dass Sie Wiederholungsschlüssel ausschalten könnten - ich vermute, dass das eine Funktion der Tastatur ist (obwohl ich mich da total irren könnte). Sonst würde ich versuchen, durch die Google-Ergebnisse für "Windows deaktivieren Tasten wiederholen". Ich weiß, dass du die Barrierefreiheit machen kannst, wo du die linke Schicht für immer gedrückt hältst, und dann dauert es ungefähr 3-5 Sekunden pro Brief, den du tippst ... nicht sicher, ob das tun würde, was du willst, aber es könnte! –

+1

Eigentlich fand ich gerade das pyHook-Modul nicht einmal nötig; Unter Windows reichen die Module win32api und win32con für diesen Zweck aus: Die Funktion win32api.GetAsyncKeyState() erfüllt die Anforderungen. Es funktioniert auch mit pyHook, aber es ist nicht erforderlich. – Sid

Verwandte Themen