Python 为什么这些代码行会导致键盘延迟,还有其他选择吗?
因此,我正在学习python,并试图创建一个代码来检测在Minecraft中按下“空格”和“a”之间的时间。问题是这个程序滞后于我的键盘/导致键盘按下延迟 我已将问题缩小到以下方面:Python 为什么这些代码行会导致键盘延迟,还有其他选择吗?,python,minecraft,lag,Python,Minecraft,Lag,因此,我正在学习python,并试图创建一个代码来检测在Minecraft中按下“空格”和“a”之间的时间。问题是这个程序滞后于我的键盘/导致键盘按下延迟 我已将问题缩小到以下方面: while True: if keyboard.is_pressed ('p'): strafe45() 如果我用这样的东西来代替它:它不会导致键盘延迟 run = 1 while run == 1: strafe45() 我想这是因为第一个是不断检查我是否输入了“p”,这是造成
while True:
if keyboard.is_pressed ('p'):
strafe45()
如果我用这样的东西来代替它:它不会导致键盘延迟
run = 1
while run == 1:
strafe45()
我想这是因为第一个是不断检查我是否输入了“p”,这是造成延迟的原因,但是我怎么能写这样的东西呢?我不能使用while run==1:因为最终它会给我一个错误,因为我按下了“a”,并且变量“start”不再有赋值
以下是完整的代码(如果需要):
import keyboard
import time
import math
def strafe45():
while True:
if keyboard.is_pressed ('space'):
print ("starting timer")
start = time.perf_counter()
time.sleep(0.05)
if keyboard.is_pressed ('a'):
end = time.perf_counter()
print ("ending timer")
tickTime = end - start
tick = 0.05
if tickTime > tick:
print ("Did not make strafe. Too slow by " + str(tickTime - tick) + "\n" +
"Time passed (r): " + str(round(tickTime/tick, 2)) + "\n" +
"Time passed (a): " + str(tickTime/tick))
break
if tickTime < tick:
print ("Did make strafe by " + str(tick - tickTime) + "\n" +
"Time passed (r): " + str(round(tickTime/tick, 2)) + "\n" +
"Time passed (a): " + str(tickTime/tick))
break
run = 1
while run == 1:
strafe45()
"""while True:
if keyboard.is_pressed ('p'):
strafe45()"""
导入键盘
导入时间
输入数学
def strafe45():
尽管如此:
如果按下键盘.u(“空格”):
打印(“启动计时器”)
开始=时间。性能计数器()
睡眠时间(0.05)
如果键盘被按下('a'):
结束=时间。性能计数器()
打印(“结束计时器”)
滴答声时间=结束-开始
刻度=0.05
如果勾选时间>勾选:
打印(“没有扫射。速度太慢了”+str(滴答声时间-滴答声)+“\n”+
“经过的时间(r):“+str(四舍五入(滴答声/滴答声,2))+”\n”+
“时间流逝(a):“+str(滴答声/滴答声))
打破
如果滴答时间<滴答:
打印(“通过“+str(滴答声时间)+”\n”进行了扫射+
“经过的时间(r):“+str(四舍五入(滴答声/滴答声,2))+”\n”+
“时间流逝(a):“+str(滴答声/滴答声))
打破
运行=1
当run==1时:
strafe45()
“”“虽然为True:
如果按下键盘.u(“p”):
strafe45()
不要经常检查每个循环,而是添加一个挂钩,只在按下一个键时进行检查<代码>键盘。按下(回调)会为每个键盘和键添加一个侦听器,该键盘和键包含给定的回调。这将缓解您的延迟问题。查看完整的文档
def check_key(x): #x should be an keyboard.KeyboardEvent
print x.name, x.scan_code, x.time
if x.name == "":
something
elif x.name == "":
something else
keyboard.on_press(check_key)
不要经常检查每个循环,而是添加一个挂钩,只在按下一个键时检查<代码>键盘。按下(回调)会为每个键盘和键添加一个侦听器,该键盘和键包含给定的回调。这将缓解您的延迟问题。查看完整的文档
def check_key(x): #x should be an keyboard.KeyboardEvent
print x.name, x.scan_code, x.time
if x.name == "":
something
elif x.name == "":
something else
keyboard.on_press(check_key)
当按下p
键时,会调用strafe45
,结果会发生一些sleep
调用
只要没有按下p
键,就会有一个紧密的while循环,在按下键时会不断检查
您应该在键处理函数之外有一个while
循环,并确保每次通过该循环时都会发生time.sleep
调用,方法是显式地将其放入循环中。如果调用函数来处理键(这是一个好主意,因为代码变得更复杂),它们不应该有自己的循环-它们应该根据按下的键对程序状态进行适当的更改
例如:
begin = None
def begin_timing():
global begin
begin = time.perf_counter()
def end_timing():
global begin
if begin is not None: # otherwise, we weren't timing yet.
end = time.perf_counter()
print('elapsed time:', end - begin)
begin = None # so that we can begin timing again.
while True:
# There needs to be a delay each time through the loop,
# but it needs to be considerably shorter than the time interval you're
# trying to measure.
time.sleep(0.01)
if keyboard.is_pressed('b'): # begin
begin_timing()
elif keyboard.is_pressed('e'): # end
end_timing()
当按下p
键时,会调用strafe45
,结果会发生一些sleep
调用
只要没有按下p
键,就会有一个紧密的while循环,在按下键时会不断检查
您应该在键处理函数之外有一个while
循环,并确保每次通过该循环时都会发生time.sleep
调用,方法是显式地将其放入循环中。如果调用函数来处理键(这是一个好主意,因为代码变得更复杂),它们不应该有自己的循环-它们应该根据按下的键对程序状态进行适当的更改
例如:
begin = None
def begin_timing():
global begin
begin = time.perf_counter()
def end_timing():
global begin
if begin is not None: # otherwise, we weren't timing yet.
end = time.perf_counter()
print('elapsed time:', end - begin)
begin = None # so that we can begin timing again.
while True:
# There needs to be a delay each time through the loop,
# but it needs to be considerably shorter than the time interval you're
# trying to measure.
time.sleep(0.01)
if keyboard.is_pressed('b'): # begin
begin_timing()
elif keyboard.is_pressed('e'): # end
end_timing()
与其不断检查每个循环,不如只在按键时添加一个钩子并进行检查。与其不断检查每个循环,不如只在按键时添加一个钩子并进行检查。