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

时间:2017-05-28 13:19:18

标签: python-3.x pygame

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

  1. 如果我快速输入,字母会重复。例如:如果我快速输入zo,则屏幕输出为zozz但如果我输入的速度很慢,则会输出zo

  2. Shift键未按预期工作。例如:如果我按左(或右)移位和z,它会输出Z但在我释放左移并输入z后,它仍会输出Z和下次当我按z时,它会输出z。我不知道为什么会发生这种情况,因为我将最后的shift标记重置为0

  3. 大写锁定键也没有按预期工作。一旦我按下capslock,输出全部为大写但是当我再次按下它时,输出会变成小写,它仍然是大写的。我在这里知道capsLock标志不起作用,但我无法调试它。

  4. 有关如何解决这些问题的任何想法?

    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()
    

1 个答案:

答案 0 :(得分:2)

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

您所要做的就是遍历事件列表并将字符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()