簡體   English   中英

如何使鍵盤輸入為unicode/japanese字符?

[英]How to make keyboard Input into unicode/japanese characters?

我有以下功能

 def game_test_write_vocabularuy():
        game_test = True    
        active = False
        text_hiragana = ''
    
        while game_test == True:
    
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    terminate()
                if event.type == pygame.KEYDOWN:
                    if active == True:
                        if event.key == pygame.K_BACKSPACE:
                            text_hiragana = text_hiragana[:-1]
                        else:
                            text_hiragana += event.unicode
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if input_rectangle.collidepoint(event.pos):
                        active = True
                    else:
                        active = False
    

    
            game_display.fill(white)
        
            if active:
                pygame.draw.rect(game_display,gray,input_rectangle,2)
            else:
                pygame.draw.rect(game_display, red, input_rectangle, 2)
            textFunc(FontJapoMedium,text_hiragana,black,input_rectangle[0] + 5,input_rectangle[1] + 5 ,False)
    
    
            Clock.tick(FPS)
            pygame.display.update()

基本上,它允許我輸入一些東西,它會在屏幕上呈現。 問題是,當我打開日文鍵盤並開始打字時,它不顯示日文文本。 相反,它只是顯示羅馬字母

例如,在我的鍵盤中 D = し,但是當我按下 D 鍵時,而不是 し,什么也沒有呈現; 好像事件未注冊我該怎么辦?

注意 - 字體不是問題

我是這樣解決的:

我只是用字典將字符轉換為平假名

 Table = {
#A Column
'a':'あ',
'ka':'か',
'ga':'が',
'sa':'さ',
'za':'ざ',
'ta':'た',
'da':'だ',
'na':'な',
'ha':'は',
'ba':'ば',
'pa':'ぱ',
'ma':'ま',
'ya':'や',
'ra':'ら',
'wa':'わ',

#I Column
'i':'い',
'ki':'き',
'gi':'ぎ',
'shi':'し',
'ji':'じ',
'chi':'ち',
'ni':'に',
'hi':'ひ',
'bi':'び',
'pi':'ぴ',
'mi':'み',
'ri':'り',

#U Column
'u':'う',
'ku':'く',
'gu':'ぐ',
'su':'す',
'zu':'ず',
'tsu':'つ',
'nu':'ぬ',
'fu':'ふ',
'bu':'ぶ',
'pu':'ぷ',
'mu':'む',
'ru':'る',
'yu':'ゆ',

#E Column
'e':'え',
'ke':'け',
'ge':'げ',
'se':'せ',
'ze':'ぜ',
'te':'て',
'de':'で',
'ne':'ね',
'he':'へ',
'be':'べ',
'pe':'ぺ',
'me':'め',
're':'れ',

#O Column
'o':'お',
'ko':'こ',
'go':'ご',
'so':'そ',
'zo':'ぞ',
'to':'と',
'do':'ど',
'no':'の',
'ho':'ほ',
'bo':'ぼ',
'po':'ぽ',
'mo':'も',
'yo':'よ',
'ro':'ろ',
'wo':'を',

#N sound
'nn':'ん',

#Characters with 3 sounds that use the small Y characters
'kya':'きゃ',
'kyu':'きゅ',
'kyo':'きょ',

'sha':'しゃ',
'shu':'しゅ',
'sho':'しょ',

'cha':'ちゃ',
'chu':'ちゅ',
'cho':'ちょ',

'nya':'にゃ',
'nyu':'にゅ',
'nyo':'にょ',

'hya':'ひゃ',
'hyu':'ひゅ',
'hyo':'ひょ',

'mya':'みゃ',
'myu':'みゅ',
'myo':'みょ',

'rya':'りゃ',
'ryu':'りゅ',
'ryo':'りょ',

'gya':'ぎゃ',
'gyu':'ぎゅ',
'gyo':'ぎょ',

'ja':'じゃ',
'ju':'じゅ',
'jo':'じょ',

'bya':'びゃ',
'byu':'びゅ',
'byo':'びょ',

'pya':'ぴゃ',
'pyu':'ぴゅ',
'pyo':'ぴょ',

#Weird characters rarely used
'di':'ぢ',
'du':'づ',

#Small Tsu
'kk':'っ',
'ss':'っ',
'tt':'っ',
'hh':'っ',
'mm':'っ',
'yy':'っ',
'rr':'っ',
'ww':'っ',
'gg':'っ',
'zz':'っ',
'dd':'っ',
'bb':'っ',
'pp':'っ',

}

然后我使用了以下功能

   def deleteText(self):
    if len(self.text) > 0:
        self.textoChico = self.textoChico[:-1]
    else:
        self.texto = self.texto[:-1]

def writeText(self):
    if len(self.text) > 3:
        self.text = ""
    if self.text in Table :
        self.texto += Table [self.text]
        self.text = ''

我認為這歸結為您的輸入法。 在 Linux PyGame 上使用“Anthy”IBus 輸入可以很好地輸入平假名文本。

懷疑您的鍵盤正在發送拉丁字符,軟件驅動程序將其轉換為平假名(等),但 PyGame 正在較低級別處理鍵盤,因此接收原始按鍵而不是轉換。

也許你可以做一個查找表來將輸入的羅馬字轉換為平假名,但我想這違背了擁有正確鍵盤的目的。 鍵盤在其他應用程序中是否按預期工作?

演示

“Umeboshi 字體”來自http://font.xxenxx.net/umeboshifont.html

參考代碼:

import pygame

# Window size
WINDOW_WIDTH    = 600
WINDOW_HEIGHT   = 100
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE

DARK_BLUE = (   3,   5,  54 )
WHITE     = ( 255, 255, 250 )


### initialisation
pygame.init()
pygame.mixer.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("Hiragana Test")

### For the simple text handling
#font     = pygame.font.SysFont( None, 16 )
font     = pygame.font.Font( 'umeboshi.ttf', 16 )
text      = ''
text_surf = font.render( text, True, WHITE )

### Main Loop
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.MOUSEBUTTONUP ):
            # On mouse-click
            pass
        elif ( event.type == pygame.KEYDOWN ):
            if ( event.key == pygame.K_BACKSPACE ):
                text = text[:-1]
            else:
                text = text + event.unicode
            #print( "TEXT: [%s]" % ( text ) )
            text_surf = font.render( text, True, WHITE )

    # Update the window, but not more than 60fps
    window.fill( DARK_BLUE )
    window.blit( text_surf, ( 10, WINDOW_HEIGHT//2 ) )
    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)


pygame.quit()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM