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