Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pygame-为什么LSHIFT在按键重复模式下不响应_Python_Keyboard_Pygame - Fatal编程技术网

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

Python Pygame-为什么LSHIFT在按键重复模式下不响应,python,keyboard,pygame,Python,Keyboard,Pygame,我正在用Pygame制作一个3D引擎。控件的一个元素涉及使用WASD、LSHIFT和SPACE来控制相机的XYZ坐标。我使用了pygame.key.set_repeat(1,10)使键生成多个pygame.KEYDOWN事件。除LSHIFT外,上述每个键都可以正常工作 通过将以下代码插入IDLE,可以复制该行为: def testKeys(): import pygame screen = pygame.display.set_mode((100,100)) pygame

我正在用Pygame制作一个3D引擎。控件的一个元素涉及使用WASD、LSHIFT和SPACE来控制相机的XYZ坐标。我使用了
pygame.key.set_repeat(1,10)
使键生成多个
pygame.KEYDOWN
事件。除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
我得到的行为是空格键工作正常(生成多个事件):

但LSHIFT键只生成一个事件:

shift

我正在使用Windows操作系统。有人能解释为什么会发生这种情况,和/或提出一个与我现在拥有的兼容(意思是类似的结构)的解决方案吗?

在使用
pygame.key.set\u repeat
时,SDL似乎没有考虑MOD键(这只是
SDL\u 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'
由于SDL2按键事件的工作原理稍有不同,所以在捕获多个shift键按下事件时没有问题(我刚刚测试了这个)。看看这个


希望能有所帮助。

@sloth这正是我所观察到的,不管这是否属实。由于cdonts有一个有效的解决方案和解释,我认为这个问题已经得到了回答,我不会试图解决这个次要问题。
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'