【问题标题】:Detect keypress but only once. Keyboard module isn't working this way检测按键但只检测一次。键盘模块不能以这种方式工作
【发布时间】:2019-06-07 23:37:48
【问题描述】:

我想检测一个按键,当它发生时我想做一次。如果我为此使用键盘模块,它会执行几次声明。

我尝试了其他模块,但我无法弄清楚。

import turtle
import keyboard

count_a = 5

#screen
wn = turtle.Screen()
wn.bgcolor("black")
wn.setup(width=800, height=600)
wn.tracer(0)

#pen
pen= turtle.Turtle()
pen.speed(0)
pen.color("white")
pen.penup()
pen.hideturtle()
pen.write(count_a, align="center", font=("courier", 24, "normal"))

#main
while True:
    wn.update()

    if keyboard.is_pressed('a'):
        count_a -= 1
        pen.clear()
        pen.write(count_a, align="center", font=("courier", 24, "normal"))

如果您在我的程序中按“a”,计数会比 -1 低很多。如果你按一次,我只希望计数为 4。

【问题讨论】:

    标签: python keypress


    【解决方案1】:

    如果您想在按下后停止循环运行,您可能需要添加break

    while True:
        wn.update()
    
        if keyboard.is_pressed('a'):
            count_a -= 1
            pen.clear()
            pen.write(count_a, align="center", font=("courier", 24, "normal"))
            
            break # <- 
    

    不过,这会停止循环。虽然,如果您希望它阻止您的代码在 if 循环内执行并且只运行一次语句,您可以添加一个在第一次按下后停止的标志。

    如果您想在第一次运行if 后停止执行代码

    #main
    waitingForA = True
    while True:
        wn.update()
    
        if keyboard.is_pressed('a') and waitingForA: # <-
            count_a -= 1
            pen.clear()
            pen.write(count_a, align="center", font=("courier", 24, "normal"))
    
            waitingForA = False # <-
    

    注意我是如何添加waitForA 变量的,然后在我们第一次按下后将其设置为False,这将停止if 语句第二次运行,因为我们的if 语句解析为TrueFalse,显然不会在 and 语句中运行。

    【讨论】:

    • 请注意,我没有运行此代码,也没有使用您所说的库。我只是使用我对循环和循环结构的理解。
    • 感谢@VietHTran,我更改了变量名以使其更简单。
    • 这很有帮助,谢谢,但是我如何将 waitingForA 的值设置回 True 以再次使用它。
    • 好吧,JavaScript 使用 keyDown 和 keyEvents 来实现这一点,所以也许可以在谷歌上查看类似的 python ——我现在不在家,所以我不能为你做这件事
    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 2019-10-29
    • 2018-10-24
    • 2013-10-05
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2019-07-27
    相关资源
    最近更新 更多