pygame怎么样制作一个简易中文输入框
Admin 2022-06-20 群英技术资讯 528 次浏览
为了解决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内置对象的内容,在Python学习中,python常用的内置对象是比较基础的知识,下文给大家简单介绍常用的python内置对象、变量、整数、浮点数、布尔类型、字符串类型和注释等知识,有需要的朋友可以看看,希望大家阅读完这篇文章能有所收获。
内容介绍Python之Selenium自动化爬虫0.介绍1.安装2.下载浏览器驱动3.实例4.开启无头模式5.保存页面截图6.模拟输入和点击a.根据文本值查找节点b.获取当前节点的文本c.打印当前网页
这篇文章主要介绍了Python 并行加速技巧分享,文章围绕文章主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
python命令行传参有哪些方法?很多新手对于python命令行传参的方法可能不是很了解,这篇文章就主要给大家分享python命令行传参的方法,对新手学习有一定的借鉴价值,感兴趣的朋友可以参考一下,下面我们一起来学习吧。
本文实例为大家分享了OpenCV实现相机校正的具体代码,供大家参考,具体内容如下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008