3

我有一个需要文本输入的 Pygame 程序。它这样做的方式是获取键盘输入,当按下某个键时,它会呈现该键,以便将其添加到屏幕上。本质上,它就像一个文本字段。问题是,当你按住 shift 时,它什么也没做。我意识到这是因为程序忽略了 shift 输入,而是在其数字小于 128 时写入文本。我曾想过在按下 shift 时设置一个变量,然后如果它是真的则大写,但字符串大写只适用于字母,而不是东西比如数字或分号。如果按下 shift 或其他什么,我是否可以将一个数字添加到键入的 ASCII 数字中以修改它?
编辑:
本质上,我只想知道是否有一个数字可以添加到 ascii 字符中,以使其看起来像是在按住 shift 键的情况下键入的。在阅读了我原来的问题后,它似乎有点晦涩难懂。

4

5 回答 5

3

我可以使用“event.unicode”属性来获取键入的键的值。

于 2010-05-07T02:11:38.910 回答
1

我深入研究这个问题。pygame 中的每个键盘事件不仅有扫描码,还有 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)
于 2013-12-08T06:47:16.047 回答
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 
于 2010-04-27T23:59:44.597 回答
0

看起来减去 32 应该得到你想要的,看看ASCII table。不过,请确保您确实首先处理的是小写字母,否则您会得到一些奇怪的字符。我不确定您的意思是大写仅适用于字母:

>>> '1234;!@#abcd'.upper()
'1234;!@#ABCD'
于 2010-04-20T01:02:26.487 回答
0

我写了一个函数,在没有足够的帮助后转换字符串。它手动转换所有内容。

于 2010-04-21T14:28:40.207 回答