歌者文明清理员 发表于 2023-3-24 21:25:37

[转载]pygame实现中文输入框

本帖最后由 歌者文明清理员 于 2023-3-25 14:05 编辑

重要的事情说三遍!
本文转自 CSDN!
本文转自 CSDN!!
本文转自 CSDN!!!


注意:

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 =
      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
            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
            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 = 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)方法,显示输入框

沙漠之烟 发表于 2023-3-25 10:05:12

厉害{:10_256:}

歌者文明清理员 发表于 2023-3-25 10:27:02

沙漠之烟 发表于 2023-3-25 10:05
厉害

转载的

沙漠之烟 发表于 2023-3-25 13:30:37

歌者文明清理员 发表于 2023-3-25 10:27
转载的

sfqxx 发表于 2023-3-25 19:51:58

{:5_101:}

Mike_python小 发表于 2023-3-25 19:58:18

歌者文明清理员 发表于 2023-3-25 10:27
转载的

不厉害{:10_256:}

liuhongrun2022 发表于 2023-3-26 08:33:44

Mike_python小 发表于 2023-3-25 19:58
不厉害

6

七彩云南 发表于 2023-3-26 10:50:19

以前不可以吗?

歌者文明清理员 发表于 2023-3-26 12:19:32

Mike_python小 发表于 2023-3-25 19:58
不厉害

Em...可以这么理解
页: [1]
查看完整版本: [转载]pygame实现中文输入框