Pregunta

Tengo que saber qué tecla se debe pulsar, pero no necesita el código del personaje, me gustaría saber cuando alguien pulse la tecla 'A' incluso si la clave obtenida es 'a' o 'A', y así, con todas las otras teclas.

No puedo usar PyGame o cualquier otra biblioteca (incluyendo Tkinter). Sólo bibliotecas de Python estándar. Y esto tiene que hacerse en un terminal, no una interfaz gráfica.

no necesita el código de caracteres. NECESITO SABER el código de clave.

Ejemplo:

ord('a') != ord('A')                      # 97 != 65
someFunction('a') == someFunction('A')    # a_code == A_code
¿Fue útil?

Solución

Vea módulo estándar TTY . Permite la conmutación desde el modo orientado a la línea predeterminada (cocido) en el modo orientado char-(cbreak) con tty.setcbreak (sys.stdin) . Una sola lectura Char de sys.stdin resultará en la próxima tecla del teclado prensado (si genera código):

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

Nota:. Solución es Unix (incluyendo Linux) solamente

Editar: En Windows intente msvcrt.getche () / getwche () . / Me tiene donde tratar ...


Editar 2: Utilizar Win32 API consola de bajo nivel a través de ctypes.windll ( ver ejemplo en SO ) con función de ReadConsoleInput . Usted debe filtrar las pulsaciones de teclas - e.EventType==KEY_EVENT y buscarse un valor e.Event.KeyEvent.wVirtualKeyCode. Ejemplo de aplicación (no en Python, sólo para tener una idea) se puede encontrar en http :?. //www.benryves.com/tutorials/ t = WinConsole & c = 4

Otros consejos

Dependiendo de lo que está tratando de lograr, tal vez usando una biblioteca como pygame sería hacer lo que quiera. Pygame contiene el manejo de pulsación de tecla más avanzados que normalmente está disponible con las bibliotecas estándar de Python.

Usted probablemente tendrá que usar Tkinter , que es el Python GUI 'estándar', y se ha incluido con el pitón durante muchos años.

Una solución de línea de comandos no es probable disponibles, debido a la forma de datos pasa dentro y fuera de los procesos de línea de comandos. programas de interfaz gráfica de usuario (de algún sabor o de otra) toda facilidad de entrada recieve a través de una secuencia de eventos (posiblemente biblioteca envuelto). Cada evento será un registro de los detalles del evento. Para los eventos de pulsación de teclas, el registro puede contener cualquiera de un código clave, modificador de campo de bits de clave, o un carácter de texto en alguna codificación. ¿Qué campos, y la forma en que se nombran depende de la biblioteca de eventos que está llamando.

Los programas de línea de comandos recibiera derechos del usuario a través de la entrada de caracteres corrientes. No hay manera de coger los datos de nivel inferior. Como Myroslav explica en su puesto, TTY de puede estar en modo de cocinado o crudo, la única diferencia es que en el modo de cocinado terminal procesará (algunos) los caracteres de control para usted, como borrar y entrar de manera que el proceso recibe líneas de entrada, en vez de 1 carácter a la vez.

El procesamiento de nada más bajo que requiere (OS dependientes) llamadas al sistema o dispositivos de caracteres abertura en / dev. la biblioteca estándar de Python proporciona ninguna instalación estándar para esto.

Si es necesario trabajar en ventanas sólo se debe tratar msvcrt .

La respuesta obvia:

someFunction = string.upper

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

o, en otras palabras (clave):

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 ...

Esta es una implementación de la función getch, que funcionaría en las plataformas Windows y Linux, en esta receta :

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

esta función devolverá el código del carácter en mayúscula:

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

y esto es para el código de caracteres en minúsculas:

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

de esta manera es mucho más fácil, y usted no tendrá que importar bibliotecas externas.

Usted tendrá que elegir uno de los dos métodos a ser el 'algunaFuncion' usted describe en su pregunta. He aquí un ejemplo:

Salida:

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

>> upCcode('A')
65

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

>> lowCcode('A')
97

Tome un vistazo a pynput módulo en Python. También tiene un bonito tutorial mediante el cual usted puede crear fácilmente los oyentes de teclado para su código.

El ejemplo oficial para los oyentes es:

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

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top