Python 3.x Pygame-键盘输入错误-在屏幕上多次打印

Python 3.x Pygame-键盘输入错误-在屏幕上多次打印,python-3.x,pygame,Python 3.x,Pygame,我试图使用python3在屏幕上显示键盘输入,但代码有一些问题 如果我打字很快,字母就会重复。例如:如果我快速键入zo,屏幕输出为zozz,但如果我缓慢键入,屏幕输出为zo shift键未按预期工作。例如:如果我按下左(或右)shift键和z,它会输出z,但在我松开左shift键并键入z后,它仍会输出z,下次我按下z时,它会输出z。我不知道为什么会发生这种情况,因为我将末尾的shift标志重置为0 capslock键也无法按预期工作。一旦我按下capslock,输出都是大写,但当我再次按下时,输

我试图使用python3在屏幕上显示键盘输入,但代码有一些问题

  • 如果我打字很快,字母就会重复。例如:如果我快速键入
    zo
    ,屏幕输出为
    zozz
    ,但如果我缓慢键入,屏幕输出为
    zo

  • shift键未按预期工作。例如:如果我按下左(或右)shift键和
    z
    ,它会输出
    z
    ,但在我松开左shift键并键入
    z
    后,它仍会输出
    z
    ,下次我按下
    z
    时,它会输出
    z
    。我不知道为什么会发生这种情况,因为我将末尾的
    shift
    标志重置为
    0

  • capslock键也无法按预期工作。一旦我按下capslock,输出都是大写,但当我再次按下时,输出变成小写,它仍然是大写。我知道这里的
    capsLock
    标志不起作用,但我无法调试它

  • 有没有关于如何克服这些问题的想法

    import pygame
    from pygame.locals import *
    
    pygame.init()
    
    def getch_mod():
    
        inputStr = ''
        shift = 0
        capsLock = 0
        a = 30
    
        screen = pygame.display.set_mode((1000, 1000))
        pygame.display.set_caption("Key Press Test")
        f1=pygame.font.SysFont("comicsansms",24)
    
        while True:
            events = list(pygame.event.get())
            for ev in events:
                screen.fill((255,255,255))
                text = f1.render('Enter password:', True, (0,0,0))
                screen.blit(text,(10,10))
    
                text = f1.render(inputStr, True, (0,0,0))
                screen.blit(text, (100,a))
    
                if (ev.type == pygame.QUIT):
                    return
    
                if pygame.key.get_focused():    
                    press = pygame.key.get_pressed()    
                    for i in range(0,len(press)):
                        if (press[i] == 1):    
                            name = pygame.key.name(i)    
                            if (name == 'left shift' or name == 'right shift'):
                                shift = 1
                                break  
                            if (name == 'caps lock'):
                                if (not capsLock):
                                    capsLock = 1
                                else:
                                    capsLock = 0
                                break
    
                            if (name != 'return' and name != 'left shift' and name != 'right shift' and name != 'caps lock'):
                                if (shift or capsLock):
                                    name = name.upper()
                                inputStr += str(name)
                                shift = 0
            pygame.display.update()
    
    c = getch_mod()
    

    您的代码对于您尝试执行的操作非常复杂

    您所要做的就是迭代事件列表,并将字符unicode表示添加到字符串中。避免调用
    pygame.key.get_pressed()
    ,因为它不考虑按键顺序

    另外,不要让逻辑出现在事件循环中,除非它作用于单个事件。目前,您正在为每一个发生的事件而不是每一帧快速播放文本

    在事件循环中使用
    pygame.key.get_focused
    是不必要的,因为如果在事件循环中放置了关键事件,则窗口必须具有用户焦点

    下面是一个关于如何blit键输入的简短示例:

    import pygame
    
    pygame.init()
    
    screen = pygame.display.set_mode((480, 720))
    
    input_str = ''
    comic_sans_font = pygame.font.SysFont("comicsansms", 24)
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
            elif event.type == pygame.KEYDOWN:
                input_str += event.unicode
    
        text = comic_sans_font.render(input_str, True, (0, 0, 0))
    
        screen.fill((255, 255, 255))
        screen.blit(text, (100, 200))
    
        pygame.display.update()
    

    我现在很尴尬。感谢Ted提供的简短代码和关于pygame的额外信息。我需要让自己对pygame及其库/功能更加熟悉,不必尴尬。一开始很难了解这些事情。