pygame怎么样制作一个简易中文输入框
Admin 2022-06-20 群英技术资讯 1076 次浏览
今天就跟大家聊聊有关“pygame怎么样制作一个简易中文输入框”的内容,可能很多人都不太了解,为了让大家认识和更进一步的了解,小编给大家总结了以下内容,希望这篇“pygame怎么样制作一个简易中文输入框”文章能对大家有帮助。为了解决pygame不能输入中文的问题,就写了一个中文输入框

以下代码需要安装:
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()
用法很简单
1.创建一个TextBox对象
TextBox参数说明:
2.在键盘按下事件时调用TextBox对象的safe_key_down(event)方法,记住要把pygame的event传进去
3.记得调用TextBox的draw(surface)方法,显示输入框
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的是有关python的lambda表达式的内容,lambda表达式是Python学习中需要掌握的知识,为帮助大家熟悉lambda表达式的作用和使用,下面给大家分享关于lambda表达式的实例,具有一定的参考价值,感兴趣的朋友可以了解一下。
我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间、描述信息以及错误或者异常发生时候的特定上下文信息。
定义匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。lambda语法的定义如下:lamb
Bagging算法(Bootstrap aggregating,引导聚集算法),又称装袋算法,是机器学习领域的一种团体学习算法。最初由Leo Breiman于1996年提出。Bagging算法可与其他分类、回归算法结合,提高其准确率、稳定性的同时,通过降低结果的方差,避免过拟合的发生
字符串转列表怎样实现,方法1,用list()直接转。方法2,如果字符串有规律特征的,则可以用split来转成想要的列表。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008