Как сделать программу python, измеряющую наносекунды между динамикой нажатия клавиш? - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь создать программу python, инициирующую отсчет наносекунд при нажатии клавиши на клавиатуре, останавливающую его при отпускании клавиши и вычисляющую, как долго клавиша была нажата. До сих пор я пробовал несколько различных структур с использованием модулей pynput и time. Я отпускаю код, приведенный ниже, неверен, но я все равно добавляю его, чтобы кто-нибудь потенциально мог указать мне в правильном направлении.

Когда я запускаю приведенный ниже код, он выводит время в наносекундах. Однако время печати продолжает увеличиваться для каждой клавиши, которую я пытаюсь использовать, независимо от того, как долго я нажимаю клавишу. Кажется, что метод: time.perf_counter_ns () не прекращает подсчет, даже когда функциональный блок завершен и после этого вызывается снова.

import pynput, time
from pynput.keyboard import Key,Listener

timer = 0
timer2 = 0

def press(Key):
    timer = time.perf_counter_ns()

def release(Key):
    timer2 = time.perf_counter_ns()
    print(timer-timer2)

with Listener(on_press=press, on_release=release) as listener:
    listener.join()

1 Ответ

1 голос
/ 16 июня 2020

Источник ошибки

Похоже, ваша проблема в том, что строка timer = time.perf_counter_ns() в press не выполняет то, что вы ожидаете.

Переменные, назначенные внутри Python функций, скрывают переменные с тем же именем из родительской области (областей). Это означает, что вы назначаете локальную переменную с именем timer, а не глобальную переменную timer, как вы ожидаете. Когда вы вычисляете timer-timer2 в release, вы используете глобальную переменную timer, значение которой никогда не меняется с 0.

Решение

Оберните таймеры в класс, который содержит timer в качестве члена.

class Timer:
    def __init__(self):
        self.timer = None

    def press(self, key):
        self.timer = time.perf_counter_ns()

    def release(self, key):
        timer2 = time.perf_counter_ns()
        print(timer2 - self.timer)

timer = Timer()
with Listener(on_press=timer.press, on_release=timer.release) as listener:
    listener.join()

Другой способ - просто использовать глобальную версию timer в вашем коде. Это считается плохой практикой, но вот как вы это сделаете.

def press(Key):
    global timer
    timer = time.perf_counter_ns()
...