3

テキスト入力が必要なPygameプログラムがあります。これを行う方法は、キーボード入力を取得することであり、キーが押されると、そのキーがレンダリングされて画面に追加されます。基本的に、テキストフィールドのように機能します。問題は、Shiftキーを押したままにすると、何も実行されないことです。これは、プログラムがシフト入力を無視し、数値が128未満の場合は代わりにテキストを書き込むためです。シフトが押されたときに変数を設定し、それがtrueの場合は大文字にすることを考えましたが、文字列の大文字化は文字にのみ影響し、物事には影響しません。数字やセミコロンのように。シフトが押された場合に変更するために入力されたASCII番号に追加できる番号、または他の何かがありますか?
編集:
基本的に、Shiftキーを押したまま入力したように見せるために、ASCII文字に追加する数字があるかどうかを知りたいだけです。私の元の質問を読んだ後、それは少しあいまいに見えました。

4

5 に答える 5

3

'event.unicode'属性を使用して、入力されたキーの値を取得できます。

于 2010-05-07T02:11:38.910 に答える
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 に答える
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 に答える
0

ASCIIテーブルを見ると、32を引くと必要なものが得られるようです。ただし、最初に実際に小文字を扱っていることを確認してください。そうしないと、奇妙な文字が表示されます。キャピタライゼーションが文字に対してのみ機能するという意味がわかりません。

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

十分な助けが得られなかった後に文字列を変換する関数を作成しました。すべてを手動で変換します。

于 2010-04-21T14:28:40.207 に答える