zoukankan      html  css  js  c++  java
  • 基于Pygame写的翻译方法

    发布时间:2018-11-01
     
    技术:pygame+easygui
     

    概述

    实现一个翻译功能,中英文的互相转换。并可以播放翻译后的内容。 翻译接口调用的是百度翻译的api接口。

    详细

    一、需求分析

    使用pygame实现一个翻译功能,并可以播放翻译内容。(模仿百度翻译做一个简单的demo)

    二、程序实现

    1、初始化pygame环境,声明出页面

    def renderText(text, position, view=screen):
        # 设置字体样式大小
        my_font = pygame.font.SysFont("SimHei", 25)
        # 渲染文字
        text = my_font.render(text, True, (255, 255, 255))
        view.blit(text, position)

    2、利用easygui弹出框实现内容输入

     import easygui as g   
      mg = g.enterbox('需要翻译的内容', title='翻译') # 文本输入框

    3、将输入的内容显示到页面上

    def text(self, text):
        global inputstr
        self.strtext = text
        print("验证 输入的内容呀:" + self.strtext)
        renderText(self.strtext, (500, 100))
        inputstr = self.strtext
        print("inputstr:" + inputstr)

    4、翻译功能的实现

    翻译的实现,主要是向百度的翻译HTTP接口提交数据,然后获得返回,

    实现如下:

    def GetResult(self):
        q = self.strtext  # 获取输入的内容
        # 判断用户是否输入了内容
        if q == "":
            print("请先输入内容")
            self.content.append("")
        else:
            print("输入的语句:" + q)
            url = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
            salt = str(random.randint(32768, 65536))
            sigin = self._appid + q + salt + self._key
            print(sigin)
            m1 = hashlib.md5()
            m1.update(sigin.encode('utf8'))
            sign = m1.hexdigest()
            print("加密更新后的:" + sign)
    
            myurl = ""  # 防止出现myurl未定义错误
            for ch in q.encode('utf8'):
                if ch > 127:
                    myurl = url + '?q=' + urllib.parse.quote(q) + 
                    '&from=' + str(self._to) + '&to=' + str(self._from)+
                    '&appid=' + str(self._appid) + '&salt=' + str(salt)+
                    '&sign=' + sign
                else:
                    myurl = url + '?q=' + urllib.parse.quote(q) + 
                    '&from=' + str(self._from) + '&to=' + str(self._to)+
                    '&appid=' + str(self._appid) + '&salt=' + str(salt)+
                    '&sign=' + sign
    
            response = requests.get(myurl)
            data = response.json()
            print(data)
            length = len(data['trans_result'])
            print(len(data['trans_result']))
            print_content = ""  # 存放翻译后的内容
            for i in range(0, length):
                if i == 0:  # 防止第一行就出现换行
                    print_content = data['trans_result'][i]['dst']
                else:
                    print_content = print_content + " 
    " + 
                    (data['trans_result'][i]['dst'])
            print("翻译后的内容:" + print_content)
            # self.t.delete(0.0, END)  # 删除之前翻译出的内容
            if self.content:  # 判断self.content中是否存有之前翻译的内容,如果有,清空
                self.content.clear()
            self.content.append(print_content)

    5、显示翻译后的内容

    def showTextAfterTrans(self):
        global afterTransText
        renderText(self.afterTransText, (500, 350))
        afterTransText = self.afterTransText

    6、语音播放功能

    自己申请一个百度AI接口就可以

    def voice():
        # 百度AI接口
        APP_ID = 'XX'
        API_KEY = 'XXXX'
        SECRET_KEY = 'XXXX'
        client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    
        global afterTransText
        q = afterTransText.strip()
        print("语音播放函数:")
        print(q)
    
        result = client.synthesis(q, 'zh', 4, {
            'vol': 5
        })
    
        print(result)
    
        # 识别正确返回语音二进制 错误则返回dict
        if not isinstance(result, dict):
            with open('audio.mp3', 'wb') as f:
                f.write(result)
                f.close()
        os.system('audio.mp3')

    为了方便看清楚整个思路实现过程,贴出整体代码如下:

    # utf-8
    import pygame
    import random
    import hashlib
    import urllib
    import requests
    from aip import AipSpeech
    import os
    import easygui as g
    from pygame.locals import *
    
    # 初始化pygame环境
    pygame.init()
    # 创建窗口
    # screen = pygame.display.set_mode((1280, 720))
    screen = pygame.display.set_mode((1400, 750))
    # 背景图片
    background = pygame.image.load("background.png").convert()
    # 转换语言按钮图片
    buttonimage = "btnlanchange.png"
    # 翻译按钮图片
    btntransimage = "btntranslate.png"
    # 语音播放按钮图片
    btnvoiceimage = "btnvoice.png"
    # 清除内容按钮图片
    btnclearimage = "btnclear.png"
    # 翻译后的内容
    afterTransText = ""
    
    font = pygame.font.SysFont('simsunnsimsun',30)
    
    flag = False
    btnx = 0  # 图片位置X坐标
    btny = 0  # 图片位置Y坐标
    w = 0  # 获取到的按钮图片的宽度
    h = 0  # 获取到的按钮图片的高度
    inputstr = ""  # 通过弹出框输入的内容
    mg = "" # 弹框输入的内容
    
    
    # 按钮类
    class Button(object):
        def __init__(self, bimage, position):
            self.buttonimage = pygame.image.load(bimage).convert()
            self.position = position
    
        def render(self):
            global btnx, btny, w, h
            w, h = self.buttonimage.get_size()  # 获取图片的长和宽
            # print("wh:")
            # print(w, h)
            x, y = self.position  # 获取传入的位置参数
            # print("xy:" + str(x), str(y))
            btnx = x - w / 2  # 最终画出的位置x坐标
            btny = y - h / 2  # 最终画出的位置y坐标
            # print("画图片时的btnx,btny:")
            # print(btnx, btny)
            screen.blit(self.buttonimage, (btnx, btny))
            '''
            经输出验证:翻译按钮在画布上的坐标(825.0,255.0);语言转换按钮在画布上的坐标(620.0,52.5)
            语音播放按钮在画布上的坐标(825.0,375.0);清除按钮在画布上的坐标(825.0,98.0)
            '''
    
    
    # 创建转换按钮button对象
    button = Button(buttonimage, (665, 65))
    # 创建翻译按钮btntranslate对象
    btntranslate = Button(btntransimage, (850, 280))
    # 创建语音播放按钮btnvoice对象
    btnvoice = Button(btnvoiceimage, (850, 400))
    # 创建文字清除按钮btnclear对象
    btnclear = Button(btnclearimage, (850, 120))
    
    
    # 写文字方法
    def renderText(text, position, view=screen):
        # 设置字体样式大小
        my_font = pygame.font.SysFont("SimHei", 25)
        # 渲染文字
        text = my_font.render(text, True, (255, 255, 255))
        view.blit(text, position)
    
    
    # 显示源语言和目标语言
    def language():
        global flag
        if not flag:
            renderText("英文", (550, 50))
            renderText("中文", (730, 50))
        else:
            renderText("中文", (550, 50))
            renderText("英文", (730, 50))
    
    
    # 源语言与目标语言转换按钮函数
    def changeLan():
        global flag
        if flag:
            flag = False
            print(flag)
        else:
            flag = True
            print(flag)
    
    
    # 翻译实现类
    class Translate:
        def __init__(self):
            self.strtext = ""
            self.afterTransText = ""
            self.content = []  # 定义空数组存放取到的内容
            self._from = 'en'
            self._to = 'zh'
            self._appid = '自己申请的id'
            self._key = '自己申请的key'
    
        # 输入内容的函数
        def text(self, text):
            global inputstr
            self.strtext = text
            print("验证 输入的内容呀:" + self.strtext)
            renderText(self.strtext, (500, 100))
            inputstr = self.strtext
            print("inputstr:" + inputstr)
    
        # 触发的翻译函数
        def afterTrans(self):
            self.GetResult()
            self.afterTransText = " "  # 执行一次清空一次
            print("验证清空吗?:" + self.afterTransText)
            for item in self.content:
                self.afterTransText = self.afterTransText + item
            print("我是翻译完要显示的字符串呀:" + self.afterTransText)
    
        # 存储并显示 翻译完的 句子的函数(防止点击翻译,显示完内容后 被刷新冲掉)
        def showTextAfterTrans(self):
            global afterTransText
            renderText(self.afterTransText, (500, 350))
            afterTransText = self.afterTransText
    
        # 抓取翻译后返回的数据
        def GetResult(self):
            q = self.strtext  # 获取输入的内容
            # 判断用户是否输入了内容
            if q == "":
                print("请先输入内容")
                self.content.append("")
            else:
                print("输入的语句:" + q)
                url = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
                salt = str(random.randint(32768, 65536))
                sigin = self._appid + q + salt + self._key
                print(sigin)
                m1 = hashlib.md5()
                m1.update(sigin.encode('utf8'))
                sign = m1.hexdigest()
                print("加密更新后的:" + sign)
    
                myurl = ""  # 防止出现myurl未定义错误
                for ch in q.encode('utf8'):
                    if ch > 127:
                        myurl = url + '?q=' + urllib.parse.quote(q) + '&from=' + str(self._to) + '&to=' + str(
                            self._from) + '&appid=' + str(self._appid) + '&salt=' + str(salt) + '&sign=' + sign
                    else:
                        myurl = url + '?q=' + urllib.parse.quote(q) + '&from=' + str(self._from) + '&to=' + str(
                            self._to) + '&appid=' + str(self._appid) + '&salt=' + str(salt) + '&sign=' + sign
    
                response = requests.get(myurl)
                data = response.json()
                print(data)
                length = len(data['trans_result'])
                print(len(data['trans_result']))
                print_content = ""  # 存放翻译后的内容
                for i in range(0, length):
                    if i == 0:  # 防止第一行就出现换行
                        print_content = data['trans_result'][i]['dst']
                    else:
                        print_content = print_content + " 
    " + (data['trans_result'][i]['dst'])
                print("翻译后的内容:" + print_content)
                # self.t.delete(0.0, END)  # 删除之前翻译出的内容
                if self.content:  # 判断self.content中是否存有之前翻译的内容,如果有,清空
                    self.content.clear()
                self.content.append(print_content)
    
    
    # 语音播放函数
    def voice():
        # 百度AI接口
        APP_ID = '自己申请的id'
        API_KEY = '自己申请的key'
        SECRET_KEY = '自己申请的秘钥'
        client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    
        global afterTransText
        q = afterTransText.strip()
        print("语音播放函数:")
        print(q)
    
        result = client.synthesis(q, 'zh', 4, {
            'vol': 5
        })
    
        print(result)
    
        # 识别正确返回语音二进制 错误则返回dict
        if not isinstance(result, dict):
            with open('audio.mp3', 'wb') as f:
                f.write(result)
                f.close()
        os.system('audio.mp3')
    
    
    # 删除已输入内容函数
    def clear():
        global inputstr
        inputstr = "点此输入需要翻译的内容"
    
        
    
    # 创建translate的对象
    translate = Translate()
    
    
    def start():
        global flag  # 语言状态标志
        isFirst = True
        while True:
            # 显示背景图
            screen.blit(background, (0, 0))
            # 显示翻译按钮图片
            btntranslate.render()
            # 显示语言栏
            language()
            # 显示语言转换按钮
            button.render()
            # 显示语音播放按钮
            btnvoice.render()
            # 显示清除按钮
            btnclear.render()
    
            # 显示输入的文本
            # translate.text()
            if isFirst:
                renderText("点击此处输入翻译的内容", (500, 100))
            else:
                renderText(inputstr, (500, 100))
    
            # 显示翻译后的文本内容
            translate.showTextAfterTrans()
    
            pygame.display.update()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:  # 监测是否按下退出按钮
                    pygame.quit()
                    exit()
                elif event.type == pygame.MOUSEBUTTONDOWN:  # 判断鼠标是否按下
                    pressed_array = pygame.mouse.get_pressed()
                    if pressed_array:
                        pos = pygame.mouse.get_pos()  # 取到鼠标的坐标位置
                        mouse_x = pos[0]
                        mouse_y = pos[1]
                        print("鼠标点击坐标:")
                        print(mouse_x, mouse_y)
                        # 判断鼠标位置是否在 转换 按钮范围内
                        if 620.0 <= mouse_x <= 710.0 and 52.5 <= mouse_y <= 77.5:
                            print('我是语言转换按钮呀...')  # 点击后触发的函数
                            changeLan()  # 调用源语言与目标语言转换栏
                        # 判断鼠标坐标位置是否属于 翻译 按钮的坐标位置
                        elif 825.0 <= mouse_x <= 875.0 and 255.0 <= mouse_y <= 305.0:
                            print("我是翻译按钮呀...")
                            translate.afterTrans()
                        # 判断鼠标坐标位置是否属于 语音播放 按钮的坐标位置
                        elif 825.0 <= mouse_x <= 875.0 and 375.0 <= mouse_y <= 425.0:
                            print("我是播放语音按钮呀...")
                            voice()
                        elif 825.0 <= mouse_x <= 875.0 and 98.0 <= mouse_y <= 142:
                            print("我是清除按钮啊...")
                            clear()
                        elif 500.0 <= mouse_x <= 600.0 and 100.0 <= mouse_y <= 200.0:
                            print("弹出框....")
                            mg = g.enterbox('需要翻译的内容', title='翻译')  # 文本输入框
                            text_surface = font.render(mg, True, (0, 0, 255))
                            print(mg)  #
                            # g.textbox(msg="内容", title="", text=mg)
    
                            # 自动识别并把语言栏转换
                            for ch in mg.encode('utf8'):
                                if ch > 127:
                                    flag = True
                                    language()
                                else:
                                    flag = False
                                    language()
    
                            # 输入内容以后 需要把之前在这显示的内容清除
                            renderText("  ", (500, 100))
                            isFirst = False
                            translate.text(mg)
    
    
    if __name__ == '__main__':
        start()

    三、项目结构

    image.png

    说明:

    test.py 是写的过程中的一个测试文件;

    audio.mp3是语音播放时用到的,复制放在目录下就可用

    四、演示效果

    image.png

    图标是找的图片,点击相应的图片处触发相应的功能。

    如果您有更好的想法,请与我交流2959723401@Foxmail.com

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

  • 相关阅读:
    legend2---开发日志12(vue如何进一步学习)
    为什么现在的年轻人生育的欲望越来越低?(转自知乎)
    legend2---开发日志13(layer_mobile的content传入dom 出现【object object】如何解决)
    legend2---项目总结(legend2的意义)
    legend2---开发日志11(如何提高终极开发效率)
    公司项目架构的演变过程(转)
    创业公司如何实施敏捷开发(敏捷开发简单流程)(转)
    创业公司一年工作总结(转)(公司失败原因)
    LayaAir引擎开发HTML5最简单教程(面向JS开发者)
    [ACM] HDU 2295 Radar (二分法+DLX 重复覆盖)
  • 原文地址:https://www.cnblogs.com/demodashi/p/10492756.html
Copyright © 2011-2022 走看看