2013-07-23 6 views
14

Ich weiß nicht, warum Python ist so komisch, Sie können dies nicht durch die Suche in Google sehr leicht finden, aber es ist ganz einfach.Detect Schlüsseleingabe in Python

Wie kann ich "SPACE" oder tatsächlich einen beliebigen Schlüssel erkennen? Wie kann ich dies tun:

print('You pressed %s' % key) 

Dies sollte in Python Kern enthalten sein, so wenden Sie sich bitte stellen keine Verbindung zwischen Module nicht für Core Python.

Antwort

17

Sie könnten ein wenig Tkinter app machen:

import Tkinter as tk 

def onKeyPress(event): 
    text.insert('end', 'You pressed %s\n' % (event.char,)) 

root = tk.Tk() 
root.geometry('300x200') 
text = tk.Text(root, background='black', foreground='white', font=('Comic Sans MS', 12)) 
text.pack() 
root.bind('<KeyPress>', onKeyPress) 
root.mainloop() 
+1

hat tk erfordern eine grafische Fenster? Ich arbeite an einem eingebetteten System. Die sys.strin.read() unten ist verlockend, aber Sie müssen die Eingabetaste drücken. – user391339

+4

@ user391339: Ich denke Tk würde ein Fenstersystem oder eine virtuelle Anzeige erfordern. Für ein eingebettetes System könnte ein "getch" -Rezept wie [dieses] (http://stackoverflow.com/a/21659588/190597) besser sein. – unutbu

+0

Beachten Sie, dass dies nur in Python 3.x funktioniert –

3

Verwenden Tkinter gibt es eine Tonne von Online-Tutorials für diese. Grundsätzlich können Sie Ereignisse erstellen. Hier ist eine link zu einer tollen Seite! Dies erleichtert das Erfassen von Klicks. Auch wenn Sie versuchen, ein Spiel zu machen, hat Tkinter auch eine GUI. Obwohl ich Python für Spiele überhaupt nicht empfehlen würde, könnte es ein lustiges Experiment sein. Viel Glück!

0

Schlüsseleingabe ist ein vordefiniertes Ereignis. Sie können Ereignisse abfangen, indem Sie event_sequence (s) an event_handle (s) anhängen, indem Sie eine oder mehrere der vorhandenen Bindungsmethoden verwenden (bind, bind_class, tag_bind, bind_all). Um das zu tun:

  1. definieren eine event_handle Methode
  2. ein Ereignis holen (event_sequence), die Ihren Fall von an events list passt

Wenn ein Ereignis eintritt, werden alle diese Bindeverfahren implizit ruft die event_handle Methode beim Übergeben eines Event Objekts, das Informationen über Besonderheiten des Ereignisses enthält, das als Argument aufgetreten ist.

Um die Tasteneingabe zu erfassen, könnte man zunächst all '<KeyPress>' oder '<KeyRelease>' Ereignisse fangen und dann die jeweiligen Schlüssel durch die Nutzung von event.keysym Attribute erfahren.

Im Folgenden wird ein Beispiel unter Verwendung von bind beide '<KeyPress>' und '<KeyRelease>' Ereignisse auf einem Widget zu fangen (root):

try:      # In order to be able to import tkinter for 
    import tkinter as tk # either in python 2 or in python 3 
except ImportError: 
    import Tkinter as tk 


def event_handle(event): 
    # Replace the window's title with event.type: input key 
    root.title("{}: {}".format(str(event.type), event.keysym)) 


if __name__ == '__main__': 
    root = tk.Tk() 
    event_sequence = '<KeyPress>' 
    root.bind(event_sequence, event_handle) 
    root.bind('<KeyRelease>', event_handle) 
    root.mainloop()