|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 歌者文明清理员 于 2023-3-25 14:05 编辑
注意:
pygame2.0已经支持输入法了,本文的方法仅供参考
为了解决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:文本框宽度
- :param h:文本框高度
- :param x:文本框坐标
- :param y:文本框坐标
- :param font:文本框中使用的字体
- :param callback:在文本框按下回车键之后的回调函数
- """
- self.width = w
- self.height = h
- self.x = x
- self.y = y
- self.text = "" # 文本框内容
- self.callback = callback
- # 创建背景surface
- self.__surface = pygame.Surface((w, h))
- # 如果font为None,那么效果可能不太好,建议传入font,更好调节
- if font is None:
- self.font = pygame.font.SysFont('microsoftyaheimicrosoftyaheiui', 16)
- else:
- self.font = font
-
- self.dagparams = DefaultDagParams()
- self.state = 0 # 0初始状态 1输入拼音状态
- self.page = 1 # 第几页
- self.limit = 5 # 显示几个汉字
- self.pinyin = ''
- self.word_list = [] # 候选词列表
- self.word_list_surf = None # 候选词surface
- self.buffer_text = '' # 联想缓冲区字符串
-
- def create_word_list_surf(self):
- """
- 创建联想词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):
- # 创建文字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))
- # 绘制联想词
- 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):
- # 异常的时候还原到初始状态
- self.state = 0 # 0初始状态 1输入拼音状态
- self.page = 1 # 第几页
- self.limit = 5 # 显示几个汉字
- self.pinyin = ''
- self.word_list = [] # 候选词列表
- self.word_list_surf = None # 候选词surface
- self.buffer_text = '' # 联想缓冲区字符串
-
-
- def callback(text):
- print("回车测试", text)
-
-
- def main():
- # 英文文本框demo
- pygame.init()
- winSur = pygame.display.set_mode((640, 480))
- # 创建文本框
- text_box = TextBox(200, 30, 200, 200, callback=callback)
-
- # 游戏主循环
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- exit()
- elif event.type == pygame.KEYDOWN:
- # 调用文本框键盘按下事件
- 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.创建一个TextBox对象
TextBox参数说明:
w:输入框的宽
h:输入框的高
x:输入框左上角x坐标
y:输入框左上角y坐标
font:字体(可以不传)
callback:按下回车之后的回调函数,这个函数必须有一个参数用来接收文本框中的字符串
2.在键盘按下事件时调用TextBox对象的safe_key_down(event)方法,记住要把pygame的event传进去
3.记得调用TextBox的draw(surface)方法,显示输入框 |
|