2009-02-22 23 views
7

Ich muss wissen, welche Taste gedrückt wird, aber nicht den Code des Charakters, ich möchte wissen, wenn jemand die Taste 'A' drücken, auch wenn der Schlüssel erhalten ist 'a' oder "A", und so mit allen anderen Schlüsseln.Wie bekomme ich die Keycodes in Python

Ich kann PyGame oder eine andere Bibliothek (einschließlich Tkinter) nicht verwenden. Nur Python-Standardbibliothek. Und das muss in einem Terminal geschehen, nicht in einer grafischen Oberfläche.

BENÖTIGEN SIE NICHT DEN CHARAKTER CODE. Ich muss den Schlüsselcode kennen.

Ex:

ord('a') != ord('A')      # 97 != 65 
someFunction('a') == someFunction('A') # a_code == A_code 
+0

grafische oder Terminal-Benutzeroberfläche? – iny

+0

Windows oder Linux? Bitte aktualisieren Sie die Frage, anstatt einen weiteren Kommentar hinzuzufügen. –

+0

Bitte aktualisieren Sie Ihre Frage mit den "Edit" -Marken, um anzuzeigen, wo Sie die Frage verbessert haben. – myroslav

Antwort

20

Siehe tty Standardmodul. Es ermöglicht den Wechsel vom standardmäßigen zeilenorientierten (gekochten) Modus in den char-orientierten (cbreak) Modus mit tty.setcbreak(sys.stdin). einzelnes Zeichen von sys.stdin Lesen wird im nächsten gedrückten Tastaturtaste führt in (wenn es Code generiert):

import sys 
import tty 
tty.setcbreak(sys.stdin) 
while True: 
    print ord(sys.stdin.read(1)) 

Hinweis: Lösung ist Unix (einschließlich Linux) nur.

Edit: Auf Windows versuchen msvcrt.getche()/getwche()./Me hat zu versuchen nirgendwo ...


Edit 2: API-Konsole win32 Low-Level-Nutzen über ctypes.windll (siehe example at SO) mit ReadConsoleInput Funktion. Sie sollten die Tasten drücken - e.EventType==KEY_EVENT und suchen Sie nach e.Event.KeyEvent.wVirtualKeyCode Wert. Anwendungsbeispiel (nicht in Python, nur um eine Idee zu bekommen) finden Sie unter http://www.benryves.com/tutorials/?t=winconsole&c=4.

+0

wiederholen, ich brauche nicht den Zeichencode, ich brauche den KeyCode, das Drücken der Taste A oder UMSCHALT + A muss gleich sein. Mit ord() erhalten Sie einen Wert mit A und einen weiteren mit SHIFT + A; und whith Tasten wie die Pfeile werden nicht funktionieren –

+0

Ich denke, die Frage, die Sie fragen, ist zu niedrig. Es war in DOS gültig. Das Betriebssystem verwendet heutzutage den Schlüsselzuordnungs-Ansatz von den Tasten zu den Symbolen, was es leicht macht, die Tastaturlayouts (Sprachen) zu wechseln, so dass es wenig wahrscheinlich ist, zu Tastaturdrücken auf niedriger Ebene zu gelangen. Pygame Workaround das. – myroslav

+0

ok. Vielen Dank. das ist, was ich wissen möchte –

9

Je nachdem, was Sie versuchen zu erreichen, vielleicht eine Bibliothek wie pygame verwenden würde das tun, was Sie wollen. Pygame enthält eine erweiterte Tastaturbedienung, die normalerweise mit Pythons Standardbibliotheken möglich ist.

+0

danke, aber ich brauche keine andere Bibliothek als die Standard-Python-Bibliothek. –

+1

Okay. Ich lasse diese Antwort hier (und lösche sie nicht), weil sie für jemand anderen nützlich sein kann, der hier eine ähnliche Frage stellt. –

+1

Und wer auch immer heruntergeregelt: Die ursprüngliche Frage besagt nicht, dass Pygame nicht akzeptabel war. –

3

Sie müssen wahrscheinlich Tkinter verwenden, das ist die 'Standard' Python-GUI, und ist seit vielen Jahren in Python enthalten.

Eine Befehlszeilenlösung ist wahrscheinlich aufgrund der Art und Weise nicht verfügbar, in der Daten in Befehlszeilenprozesse ein- und ausgeht. GUI-Programme (von irgendeinem Geschmack oder anderem) empfangen alle Benutzereingaben durch einen (möglicherweise in einer Bibliothek eingebetteten) Ereignisstrom. Jede Veranstaltung wird eine Aufzeichnung der Details der Veranstaltung sein. Bei Tastenanschlagsereignissen kann der Datensatz einen Schlüsselcode, ein Modifizierschlüssel-Bitfeld oder ein Textzeichen in einer Codierung enthalten. Welche Felder und wie sie benannt werden, hängt von der Ereignisbibliothek ab, die Sie aufrufen.

Befehlszeilenprogramme empfangen Benutzereingaben über Zeichenströme. Es gibt keine Möglichkeit, Daten auf niedrigerer Ebene zu erfassen. Wie myroslav in seinem Beitrag erklärt hat, können tty's im gekochten oder ungekochten Modus sein, der einzige Unterschied ist, dass das Terminal im Kontrollmodus (einige) Steuerzeichen für Sie verarbeitet, wie löschen und eingeben, so dass der Prozess stattdessen Eingabezeilen erhält von 1 Zeichen gleichzeitig.

Die Verarbeitung von etwas niedriger als das erfordert (Betriebssystem abhängig) Systemaufrufe oder Öffnen von Zeichengeräten in/dev. Die Standardbibliothek von Python bietet hierfür keine Standardfunktionalität.

0

Wenn Sie nur in Windows arbeiten müssen, sollten Sie versuchen msvcrt.

0

Die offensichtliche Antwort:

someFunction = string.upper 

ord('a') != ord('A')      # 97 != 65 
someFunction('a') == someFunction('A') # a_code == A_code 

oder, in anderen (key) Worte:

char_from_user = getch().upper() # read a char converting to uppercase 
if char == 'Q': 
    # quit 
    exit = True # or something 
elif char in ['A', 'K']: 
    do_something() 

etc ...

Hier ist eine Implementierung der getch Funktion ist, würde das Arbeiten in Windows- und Linux-Plattformen, based on this recipe:

class _Getch(object): 
    """Gets a single character from standard input. 
     Does not echo to the screen.""" 
    def __init__(self): 
     try: 
      self.impl = _GetchWindows() 
     except ImportError: 
      self.impl = _GetchUnix() 

    def __call__(self): 
     return self.impl() 

class _GetchUnix(object): 
    def __init__(self): 
     import tty, sys 

    def __call__(self): 
     import sys, tty, termios 
     fd = sys.stdin.fileno() 
     old_settings = termios.tcgetattr(fd) 
     try: 
      tty.setraw(sys.stdin.fileno()) 
      ch = sys.stdin.read(1) 
     finally: 
      termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
     return ch 


class _GetchWindows(object): 
    def __init__(self): 
     import msvcrt 

    def __call__(self): 
     import msvcrt 
     return msvcrt.getch() 


getch = _Getch() 
0

diese Funktion des Code für die Großbuchstaben zurück:

def upCcode(ch): 
    if(len(ch) == 1): 
     return ord(ch.upper()) 

und dies ist für den Kleinbuchstaben-Code:

def lowCcode(ch): 
     if(len(ch) == 1): 
      return ord(ch.lower()) 

diese Art und Weise ist viel einfacher, und Sie werden nicht brauchen Importieren Sie externe Bibliotheken.

Sie müssen eine der beiden Methoden auswählen, um die 'someFunction' zu sein, die Sie in Ihrer Frage beschrieben haben. Hier ein Beispiel:

OUTPUT:

# when using upCode(): 
>> upCcode('a') 
65 

>> upCcode('A') 
65 

# when using lowCode(): 
>> lowCcode('a') 
97 

>> lowCcode('A') 
97 
Verwandte Themen