【问题标题】:Pygame program that can get keyboard input with caps [duplicate]可以使用大写字母获取键盘输入的Pygame程序[重复]
【发布时间】:2011-02-09 22:11:52
【问题描述】:

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

【问题讨论】:

  • “要添加到 ascii 字符的数字”是 32。将32 添加到'a' 将得到'A'。但是,您仍然应该尝试让您的 shift 键正常工作。 Pygame 非常擅长识别修改键。这才是你应该解决的真正问题。
  • 和我的钥匙无关。我认为 pygame 没有“pygame.K_A”,只有“pygame.K_a”这一事实足以证明这一点。按下 a 时,它无法识别换档。我肯定知道。
  • 我错了。对不起泽维尔。我不知道“event.unicode”属性。知道我这样做了,一切正常。

标签: python ascii character pygame shift


【解决方案1】:

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

>>> '1234;!@#abcd'.upper()
'1234;!@#ABCD'

【讨论】:

  • 在您的示例中,仅更改了 abcd 字符。我就是这个意思。
  • 我试过这个,它适用于字母,但这不是我想要的,因为当输入其他任何内容时它会出现奇怪的字符。我想要一个转换,当它改变字母时,它就像 shift 键一样。有没有办法得到这个?
  • 例如,下面是一些伪代码: if key
  • 我仍然不确定我是否理解。如果你想要只大写字母的东西,为什么upper() 不起作用?我给出的示例中的字符串需要在您的场景中转换为什么?
  • 我不想要只大写字母的东西。我想要类似 shift 键的东西。
【解决方案2】:

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

【讨论】:

  • 我不需要这个函数,因为我现在知道 pygame Event 类的 unicode 属性了。
【解决方案3】:

将此类添加到您的代码中应该可以解决问题。要获取用户按下的字符,请从类中调用 getCharacter 函数。您可以更改 if keyPress >= 32 和 keyPress

# 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 

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我深入研究这个问题。 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多