基于Pygame写的翻译方法
概述
详细
一、需求分析
使用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
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
基于Pygame写的翻译方法的更多相关文章
- 解决CSS垂直居中的几种方法(基于绝对定位,基于视口单位,Flexbox方法)
在CSS中对元素进行水平居中是非常简单的:如果它是一个行内元素,就对它的父元素应用 text-align: center ;如果它是一个块级元素,就对它自身应用 margin: auto.然而如果要对 ...
- 基于HALCON的模板匹配方法总结
注:很抱歉,忘记从转载链接了,作者莫怪.... 基于HALCON的模板匹配方法总结 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多 ...
- tensorflow实现基于LSTM的文本分类方法
tensorflow实现基于LSTM的文本分类方法 作者:u010223750 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实 ...
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- 基于PYQT5的截图翻译工具
基于PYQT5的截图翻译工具 功能介绍 翻译功能 截图功能(快捷键 + 截图存储到剪切板中) 文字识别OCR(基于百度API的文字识别) UI 界面 截图 截图可以使用第三方截图 或 使用PyQt5截 ...
- springmvc2 一个控制器写多个方法(非注解方式)
出处:http://blog.csdn.net/xuewenke/article/details/23895999 springmvc2 一个控制器写多个方法(非注解方式) 分类: spring 20 ...
- 基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...
- struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法
struts2 action配置时 method 省略不写 默认执行方法是父类ActionSuppot中的execute()方法
- SpringMVC实现一个controller写多个方法
MultiActionController与ParameterMethodNameResolver在一个Controller类中定义多个方法,并根据使用者的请求来执行当中的某个方法,相当于Struts ...
随机推荐
- 案例导入和导出Scott用户
ylbtech-Oracle:案例导入和导出Scott用户 导入和导出Scott用户 1. 导出Scott用户下的所有对象返回顶部 1.1, Microsoft Windows [版本 ] 版权所有 ...
- go语言之进阶篇方法值
1.方法值 示例: package main import "fmt" type Person struct { name string //名字 sex byte //性别, 字 ...
- iOS 加密的3种方法
//需要导入 #import <CommonCrypto/CommonCryptor.h> ==============MD5加密============ NSString *str ...
- [leetcode]Length of Last Word @ Python
原题地址:https://oj.leetcode.com/problems/length-of-last-word/ 题意: Given a string s consists of upper/lo ...
- 随机蕨(Random Fern)
最近在做 Zdenek Kalal 的 TLD 算法,其成果发表在CVPR 2010 上,文章的名字叫做 P-N Learning: Bootstrapping Binary Classifiers ...
- Android -- ConditionVariable
线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步.提供了三个方法block().open().close() ...
- 转:利用Eclipse CDT 阅读C/C++代码
转自: https://www.oschina.net/question/234345_41419 排版与说明都很不错,推荐一看.
- extjs_08_界面布局
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- Android权限判断checkPermission
判断本程序是否拥有某权限的方法: private static final String EXTERNAL_STORAGE_PERMISSION = "android.permission. ...
- C#.NET常见问题(FAQ)-如何把文本复制粘贴到文本框的光标位置
前面已经通过Clipborad.SetText之后,这里就要先把目标文本框的文本改成插入之后的值,然后修改光标所在位置