基于Pygame写的翻译方法

news/2024/7/3 0:59:23
发布时间:2018-11-01
技术:pygame+easygui

概述

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

详细

代码下载:http://www.demodashi.com/demo/14326.html

一、需求分析

使用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 inputstrself.strtext = textprint("验证 输入的内容呀:" + self.strtext)renderText(self.strtext, (500, 100))inputstr = self.strtextprint("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._keyprint(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=' + signelse:myurl = url + '?q=' + urllib.parse.quote(q) + '&from=' + str(self._from) + '&to=' + str(self._to)+'&appid=' + str(self._appid) + '&salt=' + str(salt)+'&sign=' + signresponse = 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 + " \n" + (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 afterTransTextrenderText(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 afterTransTextq = afterTransText.strip()print("语音播放函数:")print(q)result = client.synthesis(q, 'zh', 4, {'vol': 5})print(result)# 识别正确返回语音二进制 错误则返回dictif 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 = positiondef render(self):global btnx, btny, w, hw, 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 flagif not flag:renderText("英文", (550, 50))renderText("中文", (730, 50))else:renderText("中文", (550, 50))renderText("英文", (730, 50))# 源语言与目标语言转换按钮函数
def changeLan():global flagif flag:flag = Falseprint(flag)else:flag = Trueprint(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 inputstrself.strtext = textprint("验证 输入的内容呀:" + self.strtext)renderText(self.strtext, (500, 100))inputstr = self.strtextprint("inputstr:" + inputstr)# 触发的翻译函数def afterTrans(self):self.GetResult()self.afterTransText = " "  # 执行一次清空一次print("验证清空吗?:" + self.afterTransText)for item in self.content:self.afterTransText = self.afterTransText + itemprint("我是翻译完要显示的字符串呀:" + self.afterTransText)# 存储并显示 翻译完的 句子的函数(防止点击翻译,显示完内容后 被刷新冲掉)def showTextAfterTrans(self):global afterTransTextrenderText(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._keyprint(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=' + signelse:myurl = url + '?q=' + urllib.parse.quote(q) + '&from=' + str(self._from) + '&to=' + str(self._to) + '&appid=' + str(self._appid) + '&salt=' + str(salt) + '&sign=' + signresponse = 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 + " \n" + (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 afterTransTextq = afterTransText.strip()print("语音播放函数:")print(q)result = client.synthesis(q, 'zh', 4, {'vol': 5})print(result)# 识别正确返回语音二进制 错误则返回dictif not isinstance(result, dict):with open('audio.mp3', 'wb') as f:f.write(result)f.close()os.system('audio.mp3')# 删除已输入内容函数
def clear():global inputstrinputstr = "点此输入需要翻译的内容"# 创建translate的对象
translate = Translate()def start():global flag  # 语言状态标志isFirst = Truewhile 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 = Truelanguage()else:flag = Falselanguage()# 输入内容以后 需要把之前在这显示的内容清除renderText("  ", (500, 100))isFirst = Falsetranslate.text(mg)if __name__ == '__main__':start()

三、项目结构

image.png

说明:

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

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

 

四、演示效果

image.png

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

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

代码下载:http://www.demodashi.com/demo/14326.html

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

转载于:https://www.cnblogs.com/demodashi/p/10492756.html


http://lihuaxi.xjx100.cn/news/236032.html

相关文章

CV03-双线性差值pytorch实现

一、双线性差值 1.1 公式 在理解双线性差值&#xff08;Bilinear Interpolation&#xff09;的含义基础上&#xff0c;参考pytorch差值的官方实现注释&#xff0c;自己实现了一遍。 差值就是利用已知点来估计未知点的值。一维上&#xff0c;可以用两点求出斜率&#xff0c;再…

2018 JVM 生态报告:79% 的 Java 开发者使用 Java 8

百度智能云 云生态狂欢季 热门云产品1折起>>> 2018 JVM 生态调查报告已于近日发布&#xff0c;该报告由 Snyk 和 The Java Magazine&#xff08;Oracle 的双月刊&#xff09;联合推出&#xff0c;旨在了解 JDK 的实现、工具、平台和应用方面的前景。基于超过 10200 …

Flutter环境搭建(Windows)

SDK获取 去官方网站下载最新的安装包 &#xff0c;或者在Github中的Flutter项目去 下载 。 将下载的安装包解压 注意&#xff1a;不要将Flutter安装到高权限路径&#xff0c;例如 C:\Program Files\ 配置环境变量&#xff0c;在Path中添加flutter\bin的全路径(如&#xff1a;D…

numpy和torch数据操作对比

对numpy和torch数据操作进行对比&#xff0c;避免遗忘。 ndarray和tensor import torch import numpy as npnp_data np.arange(6).reshape((2, 3)) torch_data torch.arange(6) # 张量 tensor2array torch_data.numpy()print(\nnumpy array:\n, np_data,\ntorch tensor\n,…

微软宣布 Win10 设备数突破8亿,距离10亿还远吗?

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; >>> 微软高管 Yusuf Mehdi 昨天在推特发布了一条推文&#xff0c;宣布运行 Windows 10 的设备数已突破 8 亿&#xff0c;比半年前增加了 1 亿。 根据之前的报道&#xff0c;两个月前 W…

【学习——字符串】字符串之一网打尽quq

学弟lyh上午讲课&#xff0c;喜闻乐见的制胡窜 一上午讲惹KMP&#xff0c; manachar&#xff0c; trie树&#xff0c; AC自动机 orz 例题都是洛咕咕上的&#xff0c; 贴一下&#xff08;督促自己不要咕 AC自动机不会qaq&#xff08;并且没有学的意向 manachar 没写过 P4555 […

CV02-FCN笔记

目录 一、Convolutionalization 卷积化 二、Upsample 上采样 2.1 Unpool反池化 2.2 Interpolation差值 2.3 Transposed Convolution转置卷积 三、Skip Architecture 3.1 特征融合 3.2 裁剪 FCN原理及实践&#xff0c;记录一些自己认为重要的要点&#xff0c;以免日后遗…

对Python课的看法

学习Python已经有两周的时间了&#xff0c;我是计算机专业的学生&#xff0c;我抱着可以多了解一种语言的想法报了Python的选修课&#xff0c;从第一次听肖老师的课开始&#xff0c;我便感受到一种好久没有感受到的课堂氛围&#xff0c;感觉十分舒服&#xff0c;不再是那种高中…