pygame实现中文输入框的示例

目录
  • 1.效果
  • 2.源码
  • 3.用法

注意:

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

(0)

相关推荐

  • python Pygame的具体使用讲解

    一.实验介绍 1.1 实验内容 在本节课中,我们将讲解Pygame的常用对象及其操作,包括图形.动画.文字.音频等,确保同学们对Pygame有一个基础的了解,同时为后续课程做好准备. 1.2 实验知识点 Pygame图形 Pygame动画 Pygame文字 Pygame音频 Pygame事件 1.3 实验环境 Python 2.7.6 Xfce终端 1.4 适合人群 本课程难度为一般,属于初级级别课程,适合具有Python基础的用户,熟悉Python基础知识加深巩固. 1.5 代码获取 本节实验

  • Python的pygame安装教程详解

    简介 关于Pygame的基本信息,pygame是什么,谁会被Pygame吸引,并且在哪里找到它. Pygame是被设计用来写游戏的python模块集合,Pygame是在优秀的SDL库之上开发的功能性包.使用python可以导入pygame来开发具有全部特性的游戏和多媒体软件,Pygame是极度轻便的并且可以运行在几乎所有的平台和操作系统上.Pygame包已经被下载过成千上万次,并且也被访问过成千上万次. Pygame是免费的,发行遵守GPL,你可以利用它开发开源的.免费的.免费软件.共享件.还有

  • Python使用pygame模块编写俄罗斯方块游戏的代码实例

    文章先介绍了关于俄罗斯方块游戏的几个术语. 边框--由10*20个空格组成,方块就落在这里面. 盒子--组成方块的其中小方块,是组成方块的基本单元. 方块--从边框顶掉下的东西,游戏者可以翻转和改变位置.每个方块由4个盒子组成. 形状--不同类型的方块.这里形状的名字被叫做T, S, Z ,J, L, I , O.如下图所示: 模版--用一个列表存放形状被翻转后的所有可能样式.全部存放在变量里,变量名字如S_SHAPE_TEMPLATE or J_SHAPE_TEMPLATE 着陆--当一个方块

  • python pygame实现五子棋小游戏

    今天学习了如何使用pygame来制作小游戏,下面是五子棋的代码,我的理解都写在注释里了 import pygame # 导入pygame模块 print(pygame.ver) # 检查pygame的版本,检查pygame有没有导入成功 EMPTY = 0 BLACK = 1 WHITE = 2 # 定义三个常量函数,用来表示白棋,黑棋,以及 空 black_color = [0, 0, 0] # 定义黑色(黑棋用,画棋盘) white_color = [255, 255, 255] # 定义白

  • Python中pygame安装方法图文详解

    本文实例讲述了Python中pygame安装方法.分享给大家供大家参考,具体如下: 这里主要描述一下我们怎样来安装pygame 可能很多人像我一样,发现了pygame是个好东东,但是就是不知道怎样使用,或者怎样安装,在百度/google上面搜索了一番后,发现没有一篇 详细描述pygame的安装过程的文章.如果你是其中的一员,那么这篇教程可能会帮助到你. 当然,在学习pygame的时候,需要你要有一定的python基础知识的.如果你已经具备了一定的python基础,那么接下来的内容可能对你来说就很

  • pygame游戏之旅 调用按钮实现游戏开始功能

    本文为大家分享了pygame游戏之旅的第12篇,供大家参考,具体内容如下 实现点击功能: click = pygame.mouse.get_pressed() print(click) if x + w > mouse[0] > x and y + h > mouse[1] > y: pygame.draw.rect(gameDisplay, ac, (x,y,w,h)) if click[0] == 1 and action != None: action() 修改显示文字: p

  • pygame游戏之旅 游戏中添加显示文字

    本文为大家分享了pygame游戏之旅的第5篇,供大家参考,具体内容如下 在游戏中添加显示文字: 这里自己定义一个crash函数接口: def crash(): message_diaplay('You Crashed') 然后实现接口函数message_display(text) def message_diaplay(text): largeText = pygame.font.Font('freesansbold.ttf',115) TextSurf, TextRect = text_obj

  • python中pygame安装过程(超级详细)

    安装时是需要设置python环境变量的,下载python的时候底下有个小框框(没有默认选中) Add Python 3.7 to PATH需要选择的,如果没有选择的话,需要自己设置,我一般比较懒,卸载了python重新下载的,让下载器自动设置. 然后是python版本问题 有人疑问这是64位还是32位,看那个[64bit]是64位,至于后面的on32是在windows上使用的意思,在Linux上使用就显示别的了. 然后检查pip的安装 如果显示No module named -pip 那么就是p

  • pygame实现中文输入框的示例

    目录 1.效果 2.源码 3.用法 注意: pygame2.0已经支持输入法了,本文的方法仅供参考 为了解决pygame不能输入中文的问题,就写了一个中文输入框 1.效果 2.源码 以下代码需要安装: pip install Pinyin2Hanzi 然后就可以直接运行啦 注意:你电脑里如果没有microsoftyaheimicrosoftyaheiui字体的话,请自行找一个中文字体 import string import pygame from Pinyin2Hanzi import Def

  • python实现简单中文词频统计示例

    本文介绍了python实现简单中文词频统计示例,分享给大家,具体如下: 任务 简单统计一个小说中哪些个汉字出现的频率最高 知识点 1.文件操作 2.字典 3.排序 4.lambda 代码 import codecs import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcParams['axes.unicode_minus

  • python3.x提取中文的正则表达式示例代码

    实例一: 读取txt文件中含有中文的字符 import re ##此处使用的编辑器是python3.x d="[\u4e00-\u9fa5]+" #中文匹配的符号 f=open('test.txt','rb') #这里以二进制读取,方便中文的转义 ,不设置回报错 这里的TXT文档 #文档内容: Hello world China 你好,你好好 This is a txt File s2f程序员杂志一2d3程序员杂志二2d3程序员杂志三2d3程序员杂志四2d3 #此处涉及到文本的读取工作

  • Vue数字输入框组件示例代码详解

    数字输入框组件 实现功能:只允许输入数字(包括小数).允许设置初始值.最大值.最小值. 为了方便,这里选用Vue的 cli-service 实现快速原型开发 首先template部分代码 <template> <div class="demo"> <input-number v-model="value" :max="10" :min="0"></input-number> &l

  • Pygame实现监听鼠标示例详解

    目录 初始化参数 鼠标移动 鼠标点击位置 输出鼠标位置及其对用的按钮 完整代码  pygame如何捕捉鼠标的活动 初始化参数 import pygame, sys from pygame.locals import * def print_text(font, x, y, text, color=(0, 0, 0)): """打印字体函数""" img_text = font.render(text, True, color) screen.bl

  • 利用Pygame制作简单动画的示例详解

    目录 前言 计时器 绘制精灵 加载精灵 完整代码 前言 实现一个帧动画,使用的一个图,根据不同的时间显示不同的图. 使用的就是如下所示的一张图,宽度780 * 300 ,使用加载图片 260 * 150来实现. pygame.init() screen = pygame.display.set_mode((400, 300), 0, 32) pygame.display.set_caption("动画") while True: for event in pygame.event.ge

  • JS正则匹配中文的方法示例

    本文实例讲述了JS正则匹配中文的方法.分享给大家供大家参考,具体如下: 需求:使用JS正则的方式将字符串 "[微笑][撇嘴][发呆][得意][流泪]" 中的汉字进行匹配输出. 示例代码: <script> var pattern1 = /[\u4e00-\u9fa5]+/g; var pattern2 = /\[[\u4e00-\u9fa5]+\]/g; var contents = "[微笑][撇嘴][发呆][得意][流泪]"; content = c

  • php ctype函数中文翻译和示例

    PHP Ctype扩展是PHP4.2开始就内建的扩展,注意,Ctype系列函数都只有一个字符串类型参数,它们返回布尔值. 复制代码 代码如下: $str = "0.1123";//检查字符串所有字符是否为数字echo "ctype_digit:" . ctype_digit($str);  //空//检测是否为数字字符串,可为负数和小数echo "is_numberic:" . is_numeric($str); //1 从上面可以看出ctype

  • Js日期选择器并自动加入到输入框中示例代码

    复制代码 代码如下: <html> <head> <title>Js日期选择器并自动加入到输入框中</title> <meta http-equiv="content-Type" content="text/html;charset=gb2312"> <script type="text/javascript"> var gMonths=new Array("一月&

  • php mb_substr()函数截取中文字符串应用示例

    substr()函数用来截取字符串,但是对于中文字符会出现问题,而mb_substr()和mb_strcut这两个函数可以,用法与substr()相似,只是在函数最后要加入多一个参数,以设定字符串的编码,使用这两个函数需要在php.ini中把php_mbstring.dll打开. <?php header("content-type:text/html; charset=utf-8"); $string = "你好我好大家好"; echo strlen($st

随机推荐