Получить нажатие клавиш в кадре на Linux в Python - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь создать функцию, которая при вызове создает временный прослушиватель (около 0,01 с), записывает нажатия клавиш на текущем таймфрейме и возвращает список этих клавиш. Нечто подобное было бы легко сделать с win32api GetAsyncKeyState, но я не совсем уверен, как это сделать на Linux.

Я нашел модуль pynput весьма полезным, но то, как он обращается со слушателями, сбило меня с толку.

У меня сейчас есть что-то вроде этого:

from pynput import keyboard
import time

t0 = time.time()
def on_press_loop(key):
    pressed_keys = []
    if time.time() - t0 < 0.01:
        pressed_keys.append(key.char)
    return pressed_keys

with keyboard.Listener(on_press=on_press_loop) as listener:
    listener.join()

1 Ответ

1 голос
/ 19 марта 2020

На терминалах Posix вы должны перенастроить stdin, чтобы он был неблокирующим, и вернуть его обратно. Это можно сделать автономно, но, возможно, вам лучше использовать для этого стороннюю библиотеку.

Terminedia (ветвь разработки) выполняет реконфигурацию и имеет функцию getch, которая будет возвращать первое нажатие - его можно легко адаптировать для всех кепрессов на интервале: https://github.com/jsbueno/terminedia/blob/d97976fb11ac54b527db4183497730883ba71515/terminedia/input.py#L116

Итак, адаптируя это getch, вы можете использовать:

from terminedia import keyboard, inkey
import time


def collect_keys(timeout=0.1) -> str:
    """Returns all keys pressed in given time interval
    """
    step = 1 / 30
    ellapsed = step
    with keyboard():
        time.sleep(step)
        key = inkey()
        while True:
            key = inkey()
            time.sleep(step)
            ellapsed += step
            if ellapsed >= timeout:
                break
    return key

Вы можете установить версию для разработки с помощью pip install git+https://github.com/jsbueno/terminedia.git - необходимые «inkey» и «клавиатура» будут доступны по умолчанию, когда будет завершен выпуск 0.3 проекта.

заявление об отказе : I я являюсь автором пакета terminedia. Хотя были намеки, извините, что не разъяснил с самого начала.

(также этот код должен работать и на Windows)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...