Frage

Ich muss wissen, welche Taste gedrückt wird, aber der Code des Zeichens nicht brauchen, möchte ich wissen, wenn jemand die ‚A‘ Taste drücken, auch wenn der Schlüssel erhalten wird, ist ‚a‘ oder ‚A‘, und so mit alle anderen Tasten.

Ich kann nicht PyGame oder jede andere Bibliothek (einschließlich Tkinter) verwenden. Nur Python Standard Library. Und diese haben in einem Terminal durchgeführt werden, nicht eine grafische Oberfläche.

NOT NEED den Zeichencode. ICH MUSS den Schlüsselcode kennen.

Beispiel:

ord('a') != ord('A')                      # 97 != 65
someFunction('a') == someFunction('A')    # a_code == A_code
War es hilfreich?

Lösung

Siehe tty Standardmodul. Es erlaubt, von Standardzeilenorientiert (gekocht) Modus in char orientierte (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: Unter Windows versuchen msvcrt.getche () / getwche () . / Me hat nirgendwo zu versuchen ...


Edit 2: Nutzen Sie win32 Low-Level-API-Konsole über ctypes.windll ( finden Sie unter Beispiel bei SO ) mit ReadConsoleInput Funktion . Sie sollen Drücken von Tasten herauszufiltern - e.EventType==KEY_EVENT und suchen e.Event.KeyEvent.wVirtualKeyCode Wert. Anwendungsbeispiel (nicht in Python, nur eine Idee zu bekommen) kann unter http finden :. //www.benryves.com/tutorials/ t = WinConsole & c = 4

Andere Tipps

Je nachdem, was Sie versuchen zu erreichen, vielleicht eine Bibliothek wie pygame tun würde, was Sie wollen. Pygame enthält erweiterte keypress Umgang als mit Python-Standardbibliotheken normalerweise verfügbar ist.

Sie werden wahrscheinlich verwenden Tkinter , die der 'Standard' Python gui ist, und wurde mit python seit vielen Jahren enthalten.

Eine Befehlszeilen Lösung ist wahrscheinlich nicht zur Verfügung, da der Weg, um Daten geht in die und aus der Befehlszeilen Prozesse. GUI-Programme (von einem gewissen Geschmack oder einem anderen) aller recieve Benutzereingabe durch einen (möglicherweise Bibliothek verpackt) Ereignisstrom. Jedes Ereignis wird eine Aufzeichnung der Einzelheiten über die Veranstaltung. Für Tastendruck Ereignisse werden kann die Aufzeichnung jeder einen Freischaltcode enthalten, Zusatztaste bitfield oder Textzeichen in einigen Codierung. Welche Felder und wie sie genannt werden, hängt von der Event-Bibliothek Sie anrufen.

Die Kommandozeilenprogramme empfangen Benutzereingabe durch Zeichenströmen. Es gibt keine Möglichkeit niedrigerer Ebene Daten zu fangen. Wie Myroslav in seinem Beitrag erläutert, kann tty des in gekocht oder ungekocht Modus, Unterschied nur in gekochtem Modi wird das Terminal (einige) Steuerzeichen für Sie sein, dass, wie so löschen, und geben Sie, dass der Prozess Linien Eingang empfängt, anstatt von 1 Zeichen in einer Zeit.

Die Verarbeitung etwas niedriger als das erfordert (O abhängig) Systemaufrufe oder Öffnungszeichen Geräte in / dev. Pythons Standardbibliothek bietet keine Standardausstattung für diese.

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

Die offensichtliche Antwort:

someFunction = string.upper

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

oder, in anderen (key) Wörter:

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, die in Windows und Linux-Plattformen funktionieren würde, Based auf diesem Rezept :

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()

wird diese Funktion den Code für den Großbuchstaben zurück:

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

und das ist für den Kleinbuchstaben-Code:

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

Auf diese Weise ist viel einfacher, und Sie werden keine externen Bibliotheken importieren müssen.

Sie müssen eine der beiden Methoden wählen, um die ‚somefunction‘ Sie in Ihrer Frage beschrieben. Hier ein Beispiel:

OUTPUT:

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

>> upCcode('A')
65

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

>> lowCcode('A')
97

Hier finden Sie aktuelle pynput Modul in Python. Es hat auch ein schönes Tutorial mit dem Sie ganz einfach Tastatur Hörer für Ihren Code erstellen können.

Das offizielle Beispiel für Hörer ist:

from pynput.keyboard import Key, Listener

def on_press(key):
    print('{0} pressed'.format(
        key))

def on_release(key):
    print('{0} release'.format(
        key))
    if key == Key.esc:
        # Stop listener
        return False

# Collect events until released
with Listener(on_press=on_press,
              on_release=on_release) as listener:
    listener.join()

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top