pygame實(shí)現(xiàn)中文輸入框的示例
注意:
pygame2.0已經(jīng)支持輸入法了,本文的方法僅供參考
為了解決pygame不能輸入中文的問題,就寫了一個中文輸入框
1.效果

2.源碼
以下代碼需要安裝:
pip install Pinyin2Hanzi
然后就可以直接運(yùn)行啦
注意:你電腦里如果沒有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傳進(jìn)去
3.記得調(diào)用TextBox的draw(surface)方法,顯示輸入框
到此這篇關(guān)于pygame實(shí)現(xiàn)中文輸入框的示例的文章就介紹到這了,更多相關(guān)pygame 中文輸入框內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Asyncio實(shí)現(xiàn)檢查網(wǎng)站狀態(tài)
這篇文章主要為大家詳細(xì)介紹了Python如何使用Asyncio實(shí)現(xiàn)檢查網(wǎng)站狀態(tài),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
對python中的乘法dot和對應(yīng)分量相乘multiply詳解
今天小編就為大家分享一篇對python中的乘法dot和對應(yīng)分量相乘multiply詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Anaconda多環(huán)境多版本python配置操作方法
下面小編就為大家?guī)硪黄狝naconda多環(huán)境多版本python配置操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
Keras SGD 隨機(jī)梯度下降優(yōu)化器參數(shù)設(shè)置方式
這篇文章主要介紹了Keras SGD 隨機(jī)梯度下降優(yōu)化器參數(shù)設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

