pygame实现中文输入框的示例

 更新时间:2021年12月03日 10:49:12   作者:狡猾的皮球  
本文主要介绍了pygame实现中文输入框的示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

注意:

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 中文输入框内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解django中视图函数的FBV和CBV

    详解django中视图函数的FBV和CBV

    FBV是指视图函数以普通函数的形式,CBV是指视图函数以类的方式,这篇文章主要介绍了django中视图函数的FBV和CBV,需要的朋友可以参考下
    2022-08-08
  • 如何在Python中引用其他模块

    如何在Python中引用其他模块

    这篇文章主要介绍了如何在Python中引用其他模块,在Python中,除了可以自定义模块外,还可以引用其他模块,主要包括使用标准库和第三方模块,下面文章分别详细的介绍,需要的小伙伴可以参考一下
    2022-06-06
  • 低版本中Python除法运算小技巧

    低版本中Python除法运算小技巧

    这篇文章主要介绍了低版本中Python除法运算小技巧,python 2.5版本中存在两种除法运算,即所谓的true除法和floor除法,本文讲解了两种方法的使用技巧,需要的朋友可以参考下
    2015-04-04
  • Python Flask利用SocketIO库实现图表的绘制

    Python Flask利用SocketIO库实现图表的绘制

    这篇文章主要为大家详细介绍了Python Flask框架如何利用SocketIO库实现图表的绘制,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • Python 字符串去除空格的五种方法

    Python 字符串去除空格的五种方法

    这篇文章主要介绍了Python 字符串去除空格的五种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python openpyxl 插入折线图实例

    Python openpyxl 插入折线图实例

    这篇文章主要介绍了Python openpyxl 插入折线图实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python使用回溯法子集树模板解决迷宫问题示例

    Python使用回溯法子集树模板解决迷宫问题示例

    这篇文章主要介绍了Python使用回溯法解决迷宫问题,简单讲述了迷宫问题的原理并结合实例形式分析了Python基于回溯法子集树模板解决迷宫问题的相关操作技巧与注意事项,需要的朋友可以参考下
    2017-09-09
  • 基于Python做一个简单的动图生成器

    基于Python做一个简单的动图生成器

    现在的年轻人都开始每天保温杯里泡枸杞,这怎么能行呢?于是怀揣着愉悦心情的想法,我开始制作GIF动图生成器,这个小工具制作的目的是为了将多张图片组合后生成一张动态的GIF图片,感兴趣的可以尝试一下
    2023-01-01
  • 详解python 支持向量机(SVM)算法

    详解python 支持向量机(SVM)算法

    这篇文章主要介绍了python SVM算法的相关资料,帮助大家更好的利用python进行数据分析,感兴趣的朋友可以了解下
    2020-09-09
  • Python实现控制台中的进度条功能代码

    Python实现控制台中的进度条功能代码

    下面小编就为大家分享一篇Python实现控制台中的进度条功能代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论