Pygame - 为什么 LSHIFT 在按键重复模式下不响应

Pygame - why LSHIFT does not respond in key repeat mode

我正在 Pygame 制作 3D 引擎。控件的一个元素涉及使用 WASD、LSHIFT 和 SPACE 来控制相机的 XYZ 坐标。我已经使用 pygame.key.set_repeat(1,10) 使键生成多个 pygame.KEYDOWN 事件。这适用于上述每个键 except LSHIFT.

可以通过将以下代码插入 IDLE 来重现该行为:

def testKeys():
    import pygame
    screen = pygame.display.set_mode((100,100))
    pygame.key.set_repeat(1,100)
    done = False
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE: print 'space'
                elif event.key == pygame.K_LSHIFT: print 'shift'
                elif event.key == pygame.ESCAPE: done = True

我得到的行为是 SPACE 键工作正常(生成多个事件):

space
space
space
space
space

但是 LSHIFT 键只生成一个事件:

shift

我正在使用 Windows OS。任何人都可以解释为什么会这样,and/or 提出一个与我现在拥有的解决方案兼容(意味着相似的结构)?

似乎在使用 pygame.key.set_repeat 时 SDL 没有考虑 MOD 键(这只是 SDL_EnableKeyRepeat 的 Python 包装器)。

您可以使用它来获得所需的行为:

def testKeys():
    import pygame
    from time import time
    screen = pygame.display.set_mode((100,100))
    pygame.key.set_repeat(1,100)
    ticks = 0
    done = False
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE: print 'space'
                elif event.key == pygame.K_ESCAPE: done = True
        new_ticks = time()
        if new_ticks - ticks >= 0.1:
            ticks = new_ticks
            if pygame.key.get_pressed()[pygame.K_LSHIFT]:
                print 'shift'

由于 SDL 2 键事件的工作方式略有不同,因此在捕获多个 shift 键按下事件时没有问题(我刚刚对此进行了测试)。看看这个Pygame implementation around SDL 2.

希望对您有所帮助。