python - 持有 Pynput 忽略键
问题描述
我有一个程序,当用户第一次按下并按住一个键时打印经过的时间,并在释放键时再次打印。如果 5 秒后,用户在释放前按住键盘上的向上箭头 3 秒,程序应打印“0:05 response 1 ON”,然后打印“0:08 response 1 OFF”。我遇到的问题是按住键寄存器作为多次按键,导致每秒打印多次时间。任何想法如何将按下并按住的键视为单次按键?
import time
from pynput import keyboard
from pynput.keyboard import Key, Listener
f = open("quick_data.txt", "a")
f.write(time.ctime() + "\n")
def show(key):
if key == keyboard.Key.enter:
global start
start = time.perf_counter()
if key == keyboard.Key.delete:
return False
if key == keyboard.Key.up:
elapsed = time.perf_counter()
x = time.gmtime(elapsed - start)
y = time.strftime('%M:%S', x)
f.write(str(y) + " response 1 ON" + "\n")
def on_release(key):
if key == keyboard.Key.up:
elapsed = time.perf_counter()
x = time.gmtime(elapsed - start)
y = time.strftime('%M:%S', x)
f.write(str(y) + " response 1 OFF" + "\n")
with keyboard.Listener(
on_press=show,
on_release=on_release) as listener:
listener.join()
解决方案
该库本身不提供按键支持,但您可以轻松地利用计时器来模拟所述功能。
只需在开始时启动一个计时器来记录按下相关键的时间"RESPONSE 1"
。如果新按键输入的时间与上次按键时间的差异超过阈值,则它(可能)是新按键,因此您写入文件“response 1 ON”。然后重置上次检测到RESPONSE 1
的按键时间,以确保按键算法同步。当您释放密钥时,on_release
触发并完成配对。当然,您可以调整和增加阈值以满足您的特定需求。
from pynput import keyboard
from pynput.keyboard import Key, Listener
f = open("quick_data.txt", "a")
f.write(time.ctime() + "\n")
pushdown_up = time.perf_counter() # initialize variable to store the time when the key associated with RESPONSE 1 was pressed
def show(key):
threshold = 0.10 # threshold for input timing to differentiate between a key being held and a new key
if key == keyboard.Key.enter:
global start
start = time.perf_counter()
print(start)
if key == keyboard.Key.delete:
return False
if key == keyboard.Key.up:
elapsed = time.perf_counter()
global pushdown_up # time of last detected keypress
if elapsed - pushdown_up < threshold:
# if another INPUT 1 press is detected again within a short threshold, then it is probably part of the current input press
pass
else: # else, then it is a start of a new input.
x = time.gmtime(elapsed - start)
y = time.strftime('%M:%S', x)
f.write(str(y) + " response 1 ON" + "\n")
print(str(y) + " response 1 ON" + "\n")
pushdown_up = elapsed # set the last registered keypress's time\
def on_release(key):
if key == keyboard.Key.up:
elapsed = time.perf_counter()
x = time.gmtime(elapsed - start)
y = time.strftime('%M:%S', x)
f.write(str(y) + " response 1 OFF" + "\n")
print(str(y) + " response 1 OFF" + "\n")
with keyboard.Listener(
on_press=show,
on_release=on_release) as listener:
listener.join()
推荐阅读
- javascript - Ejs 个人资料卡格式
- android - Tablayout 在 Android 上的 Activity 中使用 viewpager2 覆盖 recyclerview
- css - 当父 div 包含另一个带有 display: inline-block 的空 div 时,父 div 高度不正确,
- reactjs - React authentication 确认密码 逻辑怎么设置我看不懂
- amazon - 特定卖家 ID 的亚马逊添加到购物车产品链接
- matlab - 使用while从matlab中的列接收数据
- snowflake-cloud-data-platform - Snowflake 中的 Match_Recognize 没有返回我认为它应该返回的内容
- flutter - 带有缓存网络图像的 SliverPersistentHeader 会导致每次滚动页面时重新加载图像
- r - 用于删除列中除某个字符串之外的所有内容的 R 函数
- matlab - 如何在 Matlab GUI 中删除 UITable 数据