如何制作一个 python 程序来测量击键动态之间的纳秒级?

How to make a python program measuring nanoseconds between keystroke dynamics?

我正在尝试制作一个 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()

错误来源

您的问题似乎是 press 中的 timer = time.perf_counter_ns() 行没有达到您的预期。

在 Python 函数中赋值的变量隐藏父作用域中同名的变量。这意味着您分配给一个名为 timer 的局部变量,而不是您期望的全局变量 timer。当您在 release 中计算 timer-timer2 时,您使用的是全局变量 timer,其值从 0.

不会改变

解决方案

将计时器包装在包含 timer 作为成员的 class 中。

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