鱼C论坛

 找回密码
 立即注册
查看: 1426|回复: 8

[技术交流] [转载]pygame实现中文输入框

[复制链接]
发表于 2023-3-24 21:25:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 歌者文明清理员 于 2023-3-25 14:05 编辑
重要的事情说三遍!
本文转自 CSDN
本文转自 CSDN!!
本文转自 CSDN!!!



注意:

pygame2.0已经支持输入法了,本文的方法仅供参考




为了解决pygame不能输入中文的问题,就写了一个中文输入框
1.效果
20200305212056189.gif
2.源码
以下代码需要安装:

pip install Pinyin2Hanzi

然后就可以直接运行啦

注意:你电脑里如果没有microsoftyaheimicrosoftyaheiui字体的话,请自行找一个中文字体
  1. import string
  2.   
  3. import pygame
  4. from Pinyin2Hanzi import DefaultDagParams
  5. from Pinyin2Hanzi import dag
  6.   
  7.   
  8. class TextBox:
  9.     def __init__(self, w, h, x, y, font=None, callback=None):
  10.         """
  11.         :param w:文本框宽度
  12.         :param h:文本框高度
  13.         :param x:文本框坐标
  14.         :param y:文本框坐标
  15.         :param font:文本框中使用的字体
  16.         :param callback:在文本框按下回车键之后的回调函数
  17.         """
  18.         self.width = w
  19.         self.height = h
  20.         self.x = x
  21.         self.y = y
  22.         self.text = ""  # 文本框内容
  23.         self.callback = callback
  24.         # 创建背景surface
  25.         self.__surface = pygame.Surface((w, h))
  26.         # 如果font为None,那么效果可能不太好,建议传入font,更好调节
  27.         if font is None:
  28.             self.font = pygame.font.SysFont('microsoftyaheimicrosoftyaheiui', 16)
  29.         else:
  30.             self.font = font
  31.   
  32.         self.dagparams = DefaultDagParams()
  33.         self.state = 0  # 0初始状态 1输入拼音状态
  34.         self.page = 1  # 第几页
  35.         self.limit = 5  # 显示几个汉字
  36.         self.pinyin = ''
  37.         self.word_list = []  # 候选词列表
  38.         self.word_list_surf = None  # 候选词surface
  39.         self.buffer_text = ''  # 联想缓冲区字符串
  40.   
  41.     def create_word_list_surf(self):
  42.         """
  43.         创建联想词surface
  44.         """
  45.         word_list = [str(index + 1) + '.' + word for index, word in enumerate(self.word_list)]
  46.         text = " ".join(word_list)
  47.         self.word_list_surf = self.font.render(text, True, (255, 255, 255))
  48.   
  49.     def draw(self, dest_surf):
  50.         # 创建文字surf
  51.         text_surf = self.font.render(self.text, True, (255, 255, 255))
  52.         # 绘制背景色
  53.         dest_surf.blit(self.__surface, (self.x, self.y))
  54.         # 绘制文字
  55.         dest_surf.blit(text_surf, (self.x, self.y + (self.height - text_surf.get_height())),
  56.                        (0, 0, self.width, self.height))
  57.         # 绘制联想词
  58.         if self.state == 1:
  59.             dest_surf.blit(self.word_list_surf,
  60.                            (self.x, self.y + (self.height - text_surf.get_height()) - 30),
  61.                            (0, 0, self.width, self.height)
  62.                            )
  63.   
  64.     def key_down(self, event):
  65.         unicode = event.unicode
  66.         key = event.key
  67.   
  68.         # 退位键
  69.         if key == 8:
  70.             self.text = self.text[:-1]
  71.             if self.state == 1:
  72.                 self.buffer_text = self.buffer_text[:-1]
  73.             return
  74.   
  75.         # 切换大小写键
  76.         if key == 301:
  77.             return
  78.   
  79.         # 回车键
  80.         if key == 13:
  81.             if self.callback:
  82.                 self.callback(self.text)
  83.             return
  84.   
  85.         # print(key)
  86.         # 空格输入中文
  87.         if self.state == 1 and key == 32:
  88.             self.state = 0
  89.             self.text = self.text[:-len(self.buffer_text)] + self.word_list[0]
  90.             self.word_list = []
  91.             self.buffer_text = ''
  92.             self.page = 1
  93.             return
  94.   
  95.         # 翻页
  96.         if self.state == 1 and key == 61:
  97.             self.page += 1
  98.             self.word_list = self.py2hz(self.buffer_text)
  99.             if len(self.word_list) == 0:
  100.                 self.page -= 1
  101.                 self.word_list = self.py2hz(self.buffer_text)
  102.             self.create_word_list_surf()
  103.             return
  104.   
  105.         # 回退
  106.         if self.state == 1 and key == 45:
  107.             self.page -= 1
  108.             if self.page < 1:
  109.                 self.page = 1
  110.             self.word_list = self.py2hz(self.buffer_text)
  111.             self.create_word_list_surf()
  112.             return
  113.   
  114.         # 选字
  115.         if self.state == 1 and key in (49, 50, 51, 52, 53):
  116.             self.state = 0
  117.             if len(self.word_list) <= key - 49:
  118.                 return
  119.             self.text = self.text[:-len(self.buffer_text)] + self.word_list[key - 49]
  120.             self.word_list = []
  121.             self.buffer_text = ''
  122.             self.page = 1
  123.             return
  124.   
  125.         if unicode != "":
  126.             char = unicode
  127.         else:
  128.             char = chr(key)
  129.   
  130.         if char in string.ascii_letters:
  131.             self.buffer_text += char
  132.             self.word_list = self.py2hz(self.buffer_text)
  133.             self.create_word_list_surf()
  134.             # print(self.buffer_text)
  135.             self.state = 1
  136.         self.text += char
  137.   
  138.     def safe_key_down(self, event):
  139.         try:
  140.             self.key_down(event)
  141.         except:
  142.             self.reset()
  143.   
  144.     def py2hz(self, pinyin):
  145.         result = dag(self.dagparams, (pinyin,), path_num=self.limit * self.page)[
  146.                  (self.page - 1) * self.limit:self.page * self.limit]
  147.         data = [item.path[0] for item in result]
  148.         return data
  149.   
  150.     def reset(self):
  151.         # 异常的时候还原到初始状态
  152.         self.state = 0  # 0初始状态 1输入拼音状态
  153.         self.page = 1  # 第几页
  154.         self.limit = 5  # 显示几个汉字
  155.         self.pinyin = ''
  156.         self.word_list = []  # 候选词列表
  157.         self.word_list_surf = None  # 候选词surface
  158.         self.buffer_text = ''  # 联想缓冲区字符串
  159.   
  160.   
  161. def callback(text):
  162.     print("回车测试", text)
  163.   
  164.   
  165. def main():
  166.     # 英文文本框demo
  167.     pygame.init()
  168.     winSur = pygame.display.set_mode((640, 480))
  169.     # 创建文本框
  170.     text_box = TextBox(200, 30, 200, 200, callback=callback)
  171.   
  172.     # 游戏主循环
  173.     while True:
  174.         for event in pygame.event.get():
  175.             if event.type == pygame.QUIT:
  176.                 exit()
  177.             elif event.type == pygame.KEYDOWN:
  178.                 # 调用文本框键盘按下事件
  179.                 text_box.safe_key_down(event)
  180.         pygame.time.delay(33)
  181.         winSur.fill((0, 50, 0))
  182.         # 绘制文本框
  183.         text_box.draw(winSur)
  184.         pygame.display.flip()
  185.   
  186.   
  187. if __name__ == '__main__':
  188.     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)方法,显示输入框
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-25 10:05:12 | 显示全部楼层
厉害

评分

参与人数 1荣誉 +5 收起 理由
一点沙 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-25 10:27:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-25 13:30:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-25 19:51:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-25 19:58:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-26 08:33:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-26 10:50:19 | 显示全部楼层
以前不可以吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-26 12:19:32 | 显示全部楼层

Em...可以这么理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-10 05:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表