> 文档中心 > 【Python之GUI开发案例】用Python的tkinter开发聚合翻译神器

【Python之GUI开发案例】用Python的tkinter开发聚合翻译神器

目录

一、效果演示

二、代码分解

三、获取python源码


一、效果演示

我用python的tkinter库开发了一个聚合翻译器,实现一键同时获取5个翻译工具的结果,包括:

有道翻译、百度翻译、必应翻译、360翻译、谷歌翻译。

首先,看一下演示效果:

我用python的tkinter库,开发了一个聚合翻译神器!

这个聚合翻译工具,核心代码是通过python网页爬虫和翻译网站API实现的翻译。

二、代码分解

首先,导入需要用到的库:

import tkinter as tkimport requestsimport http.clientimport hashlibimport urllibimport randomimport jsonfrom translate import Translator # 谷歌翻译库

由于我想让这个工具,支持中英双向翻译,所以我定义了一个函数,判断输入是中文还是英文:

def is_all_chinese(strs):"""检验是否是中文字符"""for _char in strs[0]:  # 判断第一个字符是否中文if not '\u4e00' <= _char <= '\u9fa5':return Falsereturn 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 + yself.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 = 0else:eng = 1url = '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说”:知乎、哔哩哔哩、小红书、新浪微博。

好看字体下载