基于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 + " \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 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 + " \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 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()
三、项目结构
说明:
test.py 是写的过程中的一个测试文件;
audio.mp3是语音播放时用到的,复制放在目录下就可用
四、演示效果
图标是找的图片,点击相应的图片处触发相应的功能。
如果您有更好的想法,请与我交流2959723401@Foxmail.com