基于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大师发表,拒绝转载,转载需要作者授权

原文地址:https://www.cnblogs.com/demodashi/p/10492756.html