【问题标题】:Why is pygame.KEYUP event triggering when the key has not been released?为什么 pygame.KEYUP 事件在 key 没有被释放的时候触发?
【发布时间】:2018-11-28 18:11:01
【问题描述】:

我正在使用 Pygame 在 Python 中制作游戏,这是导致问题的代码部分。

#Game Mainloop
isRunning = True
while isRunning:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        isRunning = False

    elif event.type == pygame.KEYDOWN:
        key = str(event.key)
        print(key + " is down")
        if event.key == pygame.K_w:
            Globals.camera_move = 1
        elif event.key == pygame.K_s:
            Globals.camera_move = 2
        elif event.key == pygame.K_a:
            Globals.camera_move = 3
        elif event.key == pygame.K_d:
            Globals.camera_move = 4
    elif event.type == pygame.KEYUP:
        key = str(event.key)
        print(key + " is up")
        Globals.camera_move = 0

我的问题是在释放键之前触发了pygame.KEYUP事件。

例如,如果我按下 W 键,则KEYDOWN 事件触发并且“119 is down”会打印到终端一次。

但是如果我继续按住 W 键,KEYUP 事件会被触发,并且“119 is up”会重复打印到终端。

当 W 键被释放时,它会停止打印到终端。

我查找了与我类似的问题,我能找到的最接近的是this。我的问题不同的原因是因为他们的问题是通过直接连接他们的机器而不是远程 vnc 来解决的。

我没有使用远程键盘,因为我直接连接到一台 linux 机器。我还在单独的 Windows 机器上运行了代码,也遇到了同样的问题。

【问题讨论】:

  • 请edit您问题中的代码并提供足够的代码,以便其他人可以运行它并重现(并可能修复)问题。
  • 大多数键盘或计算机接口都有某种自动重复功能,当一个键被按住超过一定长度时,它可能会模拟KEYDOWN(和相应的KEYUP事件)时间。请参阅pygame.key.set_repeat()的文档

标签: python python-3.x pygame keyevent


【解决方案1】:

使用pygame.key.set_repeat() 控制按键的重复方式:

启用键盘重复时,按住的键将生成多个pygame.KEYDOWN 事件。 [...]

[...] 要禁用键重复调用此函数,不带参数或延迟设置为 0。

只需致电pygame.key.set_repeat() 即可禁用重复键:

pygame.key.set_repeat()

isRunning = True
while isRunning:
    for event in pygame.event.get():
        # [...]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2017-11-11
    • 2011-04-27
    • 2020-04-15
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多