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

问题描述 投票:1回答:1

[我正在尝试使一个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()
python time keyboard-events keystroke pynput
1个回答
1
投票

错误来源

[您的问题似乎是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()
© www.soinside.com 2019 - 2024. All rights reserved.