2017-05-28 89 views
1

我想在屏幕上使用python3显示键盘输入,但这里有一些代码问题。Pygame - 键盘输入错误 - 多次在屏幕上打印

  1. 如果我迅速输入,字母得到重复。例如:如果我快速输入zo,屏幕输出为zozz,但是如果我输入缓慢,则输出zo

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

  3. 大写字母键不能按预期工作。一旦我按下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() 

回答

2

您的代码对于您要做的事很复杂。

您只需遍历事件列表并将字符unicode表示添加到字符串即可。避免调用pygame.key.get_pressed(),因为它不考虑按键的顺序。

另外,在事件循环中没有你的逻辑,除非它在单个事件上作用。目前,你正在为发生的每一件事发生事件,而不是每一帧。

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

下面是关于如何做块键输入一个简单的例子:

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

我现在很尴尬。感谢Ted提供了简短的代码和pygame的额外信息。我需要让自己更加适应pygame及其库函数 –

+0

不需要尴尬。起初可能很难知道这些事情。 –