目录
一、效果演示
我用python的tkinter库开发了一个聚合翻译器,实现一键同时获取5个翻译工具的结果,包括:
有道翻译、百度翻译、必应翻译、360翻译、谷歌翻译。
首先,看一下演示效果:
我用python的tkinter库,开发了一个聚合翻译神器!
这个聚合翻译工具,核心代码是通过python网页爬虫和翻译网站API实现的翻译。
二、代码分解
首先,导入需要用到的库:
import tkinter as tk
import requests
import http.client
import hashlib
import urllib
import random
import json
from translate import Translator # 谷歌翻译库
由于我想让这个工具,支持中英双向翻译,所以我定义了一个函数,判断输入是中文还是英文:
def is_all_chinese(strs):
"""检验是否是中文字符"""
for _char in strs[0]: # 判断第一个字符是否中文
if not '\u4e00' <= _char <= '\u9fa5':
return False
return True
这个函数不太严谨,只判断了输入内容的第一个字符是中文还是英文,这样会导致如果输入既有中文又有英文,会出现判断失败。后续需要改进,改为判断全部输入内容。
然后,下面是依次针对每个翻译网站的网页爬虫、API爬取,实现翻译功能,这里就不贴Python源码了。
下面,重点讲解下用tkinter实现的GUI前台界面。
class TransTool():
"""聚合翻译tkinter界面工具"""
def __init__(self):
self.window = tk.Tk()
self.window.title("聚合翻译器 | 马哥python说")
self.window.geometry("600x300+350+300") # width x height + x + y
self.l1 = tk.Label(self.window, text="输入内容:", font="微软雅黑 14", height=2)
self.l1.grid()
self.l2 = tk.Label(self.window, text="有道翻译:", font="微软雅黑 16", height=2)
self.l2.grid()
self.l3 = tk.Label(self.window, text="百度翻译:", font="微软雅黑 16", height=2)
self.l3.grid()
self.l3 = tk.Label(self.window, text="必应翻译:", font="微软雅黑 16", height=2)
self.l3.grid()
self.l3 = tk.Label(self.window, text="360翻译:", font="微软雅黑 16", height=2)
self.l3.grid()
self.l3 = tk.Label(self.window, text="谷歌翻译:", font="微软雅黑 16", height=2)
self.l3.grid()
self.var_input = tk.StringVar(value='请输入一段文本') # 输入框默认值
self.var_youdao = tk.StringVar()
self.var_baidu = tk.StringVar()
self.var_bing = tk.StringVar()
self.var_360 = tk.StringVar()
self.var_google = tk.StringVar()
self.e1 = tk.Entry(self.window, textvariable=self.var_input, width=50, bg='#FCFCFC')
self.e1.grid(row=0, column=1)
self.e2 = tk.Entry(self.window, textvariable=self.var_youdao, width=50, bg='#FFD2D2')
self.e2.grid(row=1, column=1)
self.e3 = tk.Entry(self.window, textvariable=self.var_baidu, width=50, bg='#FFECF5')
self.e3.grid(row=2, column=1)
self.e3 = tk.Entry(self.window, textvariable=self.var_bing, width=50, bg='#FFE6FF')
self.e3.grid(row=3, column=1)
self.e3 = tk.Entry(self.window, textvariable=self.var_360, width=50, bg='#F1E1FF')
self.e3.grid(row=4, column=1)
self.e4 = tk.Entry(self.window, textvariable=self.var_google, width=50, bg='#DFFFDF')
self.e4.grid(row=5, column=1)
self.b1 = tk.Button(self.window, text="翻译", command=self.trans_all, width=10, font="微软雅黑 18",
activebackground="red", )
self.b1.place(x=100, y=260)
self.b2 = tk.Button(self.window, text="退出", command=self.window.quit, width=10, font="微软雅黑 18")
self.b2.place(x=280, y=260)
self.window.mainloop()
def trans_youdao(self):
"""有道翻译"""
content = self.e1.get()
data = {
"i": content,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTIME",
"typoResult": "false"
}
response = requests.post("http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule",
data=data).json()
resp = response["translateResult"][0][0]["tgt"]
print('有道翻译结果:{}'.format(resp))
self.var_youdao.set(resp)
def trans_baidu(self):
"""百度翻译"""
content = self.e1.get()
bt = BaiduTranslator(toLang="en", text=content)
resp = bt.translate()
print('百度翻译结果:{}'.format(resp))
self.var_baidu.set(resp)
def trans_360(self):
"""360翻译"""
content = self.e1.get()
if is_all_chinese(content):
eng = 0
else:
eng = 1
url = 'https://fanyi.so.com/index/search?eng={}&validate=&ignore_trans=0&query={}'.format(eng, content)
headers = {
# "cookie": "Q=u=fbybzfx&n=&le=p29fo19gp2fyAQNkAwZhL29g&m=ZGt2WGWOWGWOWGWOWGWOWGWOZGZl&qid=51678245&im=1_t01e65713e964f6c934&src=pcw_eyun&t=1; T=s=e3f53835f17dd55e4b4511508d05615e&t=1639266571&lm=0-1&lf=2&sk=cde45ff5905f7ba4b29924c0a5f8a52b&mt=1639266571&rc=&v=2.0&a=1; QiHooGUID=9A41C06C1F80E4EE010234B5D14B467C.1640573892775; Q_UDID=8802ce11-020e-5abb-061c-aaa9f20e1824; __guid=144965027.3838809587334749700.1640573886481.818; count=1; gtHuid=1; __huid=115iqIZOUAuXoKvm2qpzgyRlTD7qxJF6wMu50nS1pErmg=",
"origin": "https://fanyi.so.com",
"pro": "fanyi",
# "referer": " https://fanyi.so.com/",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"user-agent": "Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1"
}
r = requests.post(url=url, headers=headers)
# print(r.status_code)
result = r.json()['data']['fanyi']
print('360翻译结果:{}'.format(result))
self.var_360.set(result)
def trans_google(self):
"""谷歌翻译"""
gg = GoogleTranslator()
text = self.e1.get()
if is_all_chinese(text):
result = gg.translate_content_en(text=text)
else:
result = gg.translate_content_ch(text=text)
print('谷歌翻译结果:{}'.format(result))
self.var_google.set(result)
def trans_bing(self):
content = self.e1.get()
if is_all_chinese(content):
source = 'zh'
target = 'en'
else:
source = 'en'
target = 'zh'
bing = Bing()
result = bing.translate(source, target, content)
print('必应翻译结果:{}'.format(result))
self.var_bing.set(result)
def trans_all(self):
self.trans_youdao()
self.trans_baidu()
self.trans_bing()
self.trans_360()
self.trans_google()
定义了一个TransTool类,这个类的作用就是利用tkinter开发前台界面,并调用各个爬虫对象实现翻译功能。
其中:
__init__构造函数,实现tkinter界面和前台逻辑处理。
trans_youdao()函数,实现有道翻译的逻辑。
trans_baidu()函数,实现百度翻译的逻辑。
trans_360()函数,实现360翻译的逻辑。
trans_google()函数,实现谷歌翻译的逻辑。
trans_bing()函数,实现必应翻译的逻辑。
trans_all()函数,调用了以上所有函数,实现全部翻译。如果有个性化需求,关闭其中某个翻译工具,把对应的那行代码注释掉就可以了,比如:
def trans_all(self):
self.trans_youdao()
# self.trans_baidu() # 关闭百度翻译
self.trans_bing()
# self.trans_360() # 关闭360翻译
self.trans_google()
这样,就只保留了有道翻译、必应翻译、谷歌翻译3种。
同时,别忘了,这个工具还支持中译英、英译中,双向翻译的哦!
三、同步讲解视频
详细讲解视频,请移步:
4分钟代码讲解,用Python开发聚合翻译神器!
四、获取python源码
爱学习的小伙伴,想获取完整python代码文件,移步vx微信公众号"老男孩的平凡之路",后台回复"聚合翻译",即可获取完整python源码文件!
我是马哥,全网累计粉丝上万,欢迎一起交流python技术。
各平台搜索“马哥python说”:知乎、哔哩哔哩、小红书、新浪微博。