pygame实现中文输入框的示例
短信预约 -IT技能 免费直播动态提醒
注意:
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)方法,显示输入框
到此这篇关于pygame实现中文输入框的示例的文章就介绍到这了,更多相关pygame 中文输入框内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341