2017-05-28 74 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

不需要尷尬。起初可能很難知道這些事情。 –