Python 为什么这些代码行会导致键盘延迟,还有其他选择吗?

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”,这是造成

因此,我正在学习python,并试图创建一个代码来检测在Minecraft中按下“空格”和“a”之间的时间。问题是这个程序滞后于我的键盘/导致键盘按下延迟

我已将问题缩小到以下方面:

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()

与其不断检查每个循环,不如只在按键时添加一个钩子并进行检查。与其不断检查每个循环,不如只在按键时添加一个钩子并进行检查。