pygame實現(xiàn)中文輸入框的示例
注意:
pygame2.0已經(jīng)支持輸入法了,本文的方法僅供參考
為了解決pygame不能輸入中文的問題,就寫了一個中文輸入框
1.效果
2.源碼
以下代碼需要安裝:
pip install Pinyin2Hanzi
然后就可以直接運行啦
注意:你電腦里如果沒有microsoftyaheimicrosoftyaheiui字體的話,請自行找一個中文字體
import string import pygame from Pinyin2Hanzi import DefaultDagParams from Pinyin2Hanzi import dag class TextBox: def __init__(self, w, h, x, y, font=None, callback=None): """ :param w:文本框?qū)挾? :param h:文本框高度 :param x:文本框坐標(biāo) :param y:文本框坐標(biāo) :param font:文本框中使用的字體 :param callback:在文本框按下回車鍵之后的回調(diào)函數(shù) """ self.width = w self.height = h self.x = x self.y = y self.text = "" # 文本框內(nèi)容 self.callback = callback # 創(chuàng)建背景surface self.__surface = pygame.Surface((w, h)) # 如果font為None,那么效果可能不太好,建議傳入font,更好調(diào)節(jié) if font is None: self.font = pygame.font.SysFont('microsoftyaheimicrosoftyaheiui', 16) else: self.font = font self.dagparams = DefaultDagParams() self.state = 0 # 0初始狀態(tài) 1輸入拼音狀態(tài) self.page = 1 # 第幾頁 self.limit = 5 # 顯示幾個漢字 self.pinyin = '' self.word_list = [] # 候選詞列表 self.word_list_surf = None # 候選詞surface self.buffer_text = '' # 聯(lián)想緩沖區(qū)字符串 def create_word_list_surf(self): """ 創(chuàng)建聯(lián)想詞surface """ word_list = [str(index + 1) + '.' + word for index, word in enumerate(self.word_list)] text = " ".join(word_list) self.word_list_surf = self.font.render(text, True, (255, 255, 255)) def draw(self, dest_surf): # 創(chuàng)建文字surf text_surf = self.font.render(self.text, True, (255, 255, 255)) # 繪制背景色 dest_surf.blit(self.__surface, (self.x, self.y)) # 繪制文字 dest_surf.blit(text_surf, (self.x, self.y + (self.height - text_surf.get_height())), (0, 0, self.width, self.height)) # 繪制聯(lián)想詞 if self.state == 1: dest_surf.blit(self.word_list_surf, (self.x, self.y + (self.height - text_surf.get_height()) - 30), (0, 0, self.width, self.height) ) def key_down(self, event): unicode = event.unicode key = event.key # 退位鍵 if key == 8: self.text = self.text[:-1] if self.state == 1: self.buffer_text = self.buffer_text[:-1] return # 切換大小寫鍵 if key == 301: return # 回車鍵 if key == 13: if self.callback: self.callback(self.text) return # print(key) # 空格輸入中文 if self.state == 1 and key == 32: self.state = 0 self.text = self.text[:-len(self.buffer_text)] + self.word_list[0] self.word_list = [] self.buffer_text = '' self.page = 1 return # 翻頁 if self.state == 1 and key == 61: self.page += 1 self.word_list = self.py2hz(self.buffer_text) if len(self.word_list) == 0: self.page -= 1 self.word_list = self.py2hz(self.buffer_text) self.create_word_list_surf() return # 回退 if self.state == 1 and key == 45: self.page -= 1 if self.page < 1: self.page = 1 self.word_list = self.py2hz(self.buffer_text) self.create_word_list_surf() return # 選字 if self.state == 1 and key in (49, 50, 51, 52, 53): self.state = 0 if len(self.word_list) <= key - 49: return self.text = self.text[:-len(self.buffer_text)] + self.word_list[key - 49] self.word_list = [] self.buffer_text = '' self.page = 1 return if unicode != "": char = unicode else: char = chr(key) if char in string.ascii_letters: self.buffer_text += char self.word_list = self.py2hz(self.buffer_text) self.create_word_list_surf() # print(self.buffer_text) self.state = 1 self.text += char def safe_key_down(self, event): try: self.key_down(event) except: self.reset() def py2hz(self, pinyin): result = dag(self.dagparams, (pinyin,), path_num=self.limit * self.page)[ (self.page - 1) * self.limit:self.page * self.limit] data = [item.path[0] for item in result] return data def reset(self): # 異常的時候還原到初始狀態(tài) self.state = 0 # 0初始狀態(tài) 1輸入拼音狀態(tài) self.page = 1 # 第幾頁 self.limit = 5 # 顯示幾個漢字 self.pinyin = '' self.word_list = [] # 候選詞列表 self.word_list_surf = None # 候選詞surface self.buffer_text = '' # 聯(lián)想緩沖區(qū)字符串 def callback(text): print("回車測試", text) def main(): # 英文文本框demo pygame.init() winSur = pygame.display.set_mode((640, 480)) # 創(chuàng)建文本框 text_box = TextBox(200, 30, 200, 200, callback=callback) # 游戲主循環(huán) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() elif event.type == pygame.KEYDOWN: # 調(diào)用文本框鍵盤按下事件 text_box.safe_key_down(event) pygame.time.delay(33) winSur.fill((0, 50, 0)) # 繪制文本框 text_box.draw(winSur) pygame.display.flip() if __name__ == '__main__': main()
3.用法
用法很簡單
1.創(chuàng)建一個TextBox對象
TextBox參數(shù)說明:
- w:輸入框的寬
- h:輸入框的高
- x:輸入框左上角x坐標(biāo)
- y:輸入框左上角y坐標(biāo)
- font:字體(可以不傳)
- callback:按下回車之后的回調(diào)函數(shù),這個函數(shù)必須有一個參數(shù)用來接收文本框中的字符串
2.在鍵盤按下事件時調(diào)用TextBox對象的safe_key_down(event)方法,記住要把pygame的event傳進去
3.記得調(diào)用TextBox的draw(surface)方法,顯示輸入框
到此這篇關(guān)于pygame實現(xiàn)中文輸入框的示例的文章就介紹到這了,更多相關(guān)pygame 中文輸入框內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Asyncio實現(xiàn)檢查網(wǎng)站狀態(tài)
這篇文章主要為大家詳細介紹了Python如何使用Asyncio實現(xiàn)檢查網(wǎng)站狀態(tài),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03對python中的乘法dot和對應(yīng)分量相乘multiply詳解
今天小編就為大家分享一篇對python中的乘法dot和對應(yīng)分量相乘multiply詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Anaconda多環(huán)境多版本python配置操作方法
下面小編就為大家?guī)硪黄狝naconda多環(huán)境多版本python配置操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Keras SGD 隨機梯度下降優(yōu)化器參數(shù)設(shè)置方式
這篇文章主要介紹了Keras SGD 隨機梯度下降優(yōu)化器參數(shù)設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06