[我正在尝试使一个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()
[您的问题似乎是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()