Подтвердить что ты не робот

Key Listeners в python?

Есть ли способ прослушивания клавиш в python без огромного раздутого модуля, такого как pygame?

Примером может быть, когда я нажал клавишу a, он будет печатать на консоли

Клавиша была нажата!

Он также должен прослушивать клавиши со стрелками/клавишу пробела/shift.

4b9b3361

Ответ 1

К сожалению, это не так просто сделать. Если вы пытаетесь создать какой-то текстовый пользовательский интерфейс, вы можете посмотреть в curses. Если вы хотите отображать такие вещи, как обычно, в терминале, но хотите ввода такого типа, вам придется работать с termios, который, к сожалению, плохо документирован в Python. Однако ни один из этих вариантов не прост, но, к сожалению. Кроме того, они не работают под Windows; если вам нужно, чтобы они работали под Windows, вам нужно будет использовать PDCurses в качестве замены для curses или pywin32, а не termios.


Я смог добиться этой работы прилично. Он печатает шестнадцатеричное представление вводимых ключей. Как я сказал в комментариях к вашему вопросу, стрелки сложны; Я думаю, вы согласитесь.

#!/usr/bin/env python
import sys
import termios
import contextlib


@contextlib.contextmanager
def raw_mode(file):
    old_attrs = termios.tcgetattr(file.fileno())
    new_attrs = old_attrs[:]
    new_attrs[3] = new_attrs[3] & ~(termios.ECHO | termios.ICANON)
    try:
        termios.tcsetattr(file.fileno(), termios.TCSADRAIN, new_attrs)
        yield
    finally:
        termios.tcsetattr(file.fileno(), termios.TCSADRAIN, old_attrs)


def main():
    print 'exit with ^C or ^D'
    with raw_mode(sys.stdin):
        try:
            while True:
                ch = sys.stdin.read(1)
                if not ch or ch == chr(4):
                    break
                print '%02x' % ord(ch),
        except (KeyboardInterrupt, EOFError):
            pass


if __name__ == '__main__':
    main()

Ответ 2

Вот как это сделать в Windows:

"""

    Display series of numbers in infinite loop
    Listen to key "s" to stop
    Only works on Windows because listening to keys
    is platform dependent

"""

# msvcrt is a windows specific native module
import msvcrt
import time

# asks whether a key has been acquired
def kbfunc():
    #this is boolean for whether the keyboard has bene hit
    x = msvcrt.kbhit()
    if x:
        #getch acquires the character encoded in binary ASCII
        ret = msvcrt.getch()
    else:
        ret = False
    return ret

#begin the counter
number = 1

#infinite loop
while True:

    #acquire the keyboard hit if exists
    x = kbfunc() 

    #if we got a keyboard hit
    if x != False and x.decode() == 's':
        #we got the key!
        #because x is a binary, we need to decode to string
        #use the decode() which is part of the binary object
        #by default, decodes via utf8
        #concatenation auto adds a space in between
        print ("STOPPING, KEY:", x.decode())
        #break loop
        break
    else:
        #prints the number
        print (number)
        #increment, there no ++ in python
        number += 1
        #wait half a second
        time.sleep(0.5)

Ответ 3

В python есть способ делать ключевые слушатели. Эта функциональность доступна через pynput.

Командная строка:

> pip install pynput

Код Python:

from pynput import ket,listener
# your code here

Ответ 4

Я искал простое решение без фокуса окна. Jayk отвечает, pynput, работает идеально для меня. Вот пример того, как я его использую.

from pynput import keyboard

def on_press(key):
    try: k = key.char # single-char keys
    except: k = key.name # other keys
    if key == keyboard.Key.esc: return False # stop listener
    if k in ['1', '2', 'left', 'right']: # keys interested
        # self.keys.append(k) # store it in global-like variable
        print('Key pressed: ' + k)
        return False # remove this if want more keys

lis = keyboard.Listener(on_press=on_press)
lis.start() # start to listen on a separate thread
lis.join() # no this if main thread is polling self.keys

Ответ 5

клавиатуры

Возьмите полный контроль над своей клавиатурой с помощью этой небольшой библиотеки Python. Захватите глобальные события, зарегистрируйте горячие клавиши, имитируйте нажатия клавиш и многое другое.

Глобальный захват событий на всех клавиатурах (захватывает ключи независимо от фокуса). Слушайте и отправляйте события клавиатуры. Работает с Windows и Linux (требуется sudo), с экспериментальной поддержкой OS X (спасибо @glitchassassin!). Pure Python, не нужно компилировать модули C. Нулевые зависимости. Trivial для установки и развертывания, просто скопируйте файлы. Python 2 и 3. Поддержка сложных горячих клавиш (например, Ctrl + Shift + M, Ctrl + Space) с контролируемым таймаутом. Включает API высокого уровня (например, запись и воспроизведение, добавление). Карты, которые на самом деле находятся в вашем макете, с полной поддержкой интернационализации (например, Ctrl + ç). События автоматически фиксируются в отдельном потоке, не блокируют основную программу. Протестировано и задокументировано. Не нарушает акцентированных мертвых ключей (я смотрю на вас, pyHook). Поддержка мыши доступна через мышь проекта (мышь для установки мыши).

Из README.md:

import keyboard

keyboard.press_and_release('shift+s, space')

keyboard.write('The quick brown fox jumps over the lazy dog.')

# Press PAGE UP then PAGE DOWN to type "foobar".
keyboard.add_hotkey('page up, page down', lambda: keyboard.write('foobar'))

# Blocks until you press esc.
keyboard.wait('esc')

# Record events until 'esc' is pressed.
recorded = keyboard.record(until='esc')
# Then replay back at three times the speed.
keyboard.play(recorded, speed_factor=3)

# Type @@ then press space to replace with abbreviation.
keyboard.add_abbreviation('@@', '[email protected]')
# Block forever.
keyboard.wait()