可以获取大写键盘输入的Pygame程序

3 投票
5 回答
5919 浏览
提问于 2025-04-15 21:48

我有一个用Pygame写的程序,需要输入文本。这个程序的工作方式是获取键盘输入,当按下一个键时,它会把这个键的内容显示在屏幕上。简单来说,它就像一个文本框。但是有个问题,当我按住Shift键时,程序没有反应。我发现这是因为程序忽略了Shift键的输入,只在按下的键的ASCII码小于128时才会显示文本。我想过在按下Shift键时设置一个变量,然后根据这个变量来决定是否把字母变成大写,但字符串的大写转换只对字母有效,对数字或分号之类的字符无效。有没有什么方法可以在按下Shift键时,给输入的ASCII码加上一个数字,或者其他什么办法?
补充:
其实,我只是想知道有没有一个数字可以加到ASCII字符上,让它看起来像是按住Shift键输入的。读完我最初的问题后,觉得表达得有点模糊。

5 个回答

1

我研究了一下这个问题。在pygame中,每一个键盘事件不仅有一个扫描码(scancode),还有一个Unicode表示。这不仅可以输入大写字母,还能支持多语言键盘的语言切换。

下面是一个简单的'输入/打印'示例,适用于pygame:

#!/usr/bin/python

import pygame

pygame.init()
screen_size=(800,60)
disp=pygame.display.set_mode(screen_size, pygame.DOUBLEBUF)
msg=u""
clock=pygame.time.Clock()
default_font=pygame.font.get_default_font()
font=pygame.font.SysFont(default_font,16)

disp.fill((240,240,240,255))
pygame.display.flip()
while(not pygame.event.pump()):
    for event in pygame.event.get():
        print event
        if event.type == pygame.QUIT:
            pygame.quit()
            break
        if event.type == pygame.KEYDOWN:
            msg+=event.unicode
            disp.fill((240,240,240,255))
            disp.blit(font.render(msg,True,(30,30,30,255)),(0,0))
            pygame.display.flip()
    clock.tick(24)
1

把这个类加到你的代码里就可以了。要获取用户按下的字符,可以调用这个类里的 getCharacter 函数。你可以修改 if keyPress >= 32 和 keyPress <= 126 的判断语句,这样就能让非字母字符在按住 shift 键时也能正常工作。

# The pygame module itself...
import pygame

class controls:

    def getKeyPress(self):
      for event in pygame.event.get():
         if event.type == KEYDOWN:    
             return event.key
         else:
             return False


    def getCharacter(self):

      # Check to see if the player has inputed a command
      keyinput = pygame.key.get_pressed()  

      character = "NULL"

      # Get all "Events" that have occurred.
      pygame.event.pump()
      keyPress = self.getKeyPress()

      #If the user presses a key on the keyboard then get the character
      if keyPress >= 32 and keyPress <= 126:
      #If the user presses the shift key while pressing another character then capitalise it
          if keyinput[K_LSHIFT]: 
              keyPress -= 32

          character = chr(keyPress)

      return character 
3

我可以使用 'event.unicode' 这个属性来获取按下的键的值。

撰写回答