基于Pygame写的翻译方法

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

概述

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

详细

一、需求分析

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

二、程序实现

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

1
2
3
4
5
6
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弹出框实现内容输入

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

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

1
2
3
4
5
6
7
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接口提交数据,然后获得返回,

实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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、显示翻译后的内容

1
2
3
4
def showTextAfterTrans(self):
    global afterTransText
    renderText(self.afterTransText, (500, 350))
    afterTransText = self.afterTransText

6、语音播放功能

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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')

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# 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()

三、项目结构

image.png

说明:

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

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

 

四、演示效果

image.png

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

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

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

posted on   demo例子集  阅读(552)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示