本文章为:tkinter桌面+爬虫request让你也可以轻松设计精美的中英文翻译软件
这里将为你介绍整个实现过程,其实整个逻辑还是非常简单的。主要包括三个部分。
1、通过浏览器抓包找到URL地址及相关的参数。然后通过request实现爬取过程。
2、通过tkinter库设计主界面,关注UI的设计,主要原则为:易用、良好和响应性好。
3、前后端交互,实现前台用户数据的推送及实现爬取的数据的展现。
好的,那么下面就围绕上述进行展开介绍。
文章目录
一、爬虫部分
这里不介绍如何使用F12进行数据包抓取和分析,大家可以各自百度一下,我这边已经抓取了其中的URL地址,然后直接上实现的代码。
备注:这里使用的是有道翻译的接口,感谢!如有冒犯,请联系和见谅,纯属技术交流和学习,无其他商业用途
(一)锁定URL地址
req_url = 'http://fanyi.youdao.com/translate'
(二)创建要提交的数据
# 创建要提交的数据
Form_Date = {}
Form_Date['i'] = input('请输入待查询字符:')
# Form_Date['i'] = 'hello,nice to meet you.' # 要翻译的内容可以更改
Form_Date['doctype'] = 'json'
data = parse.urlencode(Form_Date).encode('utf-8') # 数据转换
(三)爬取过程调用
#爬取过程调用
response = request.urlopen(req_url, data) # 提交数据并解析
html = response.read().decode('utf-8') # 服务器返回结果读取
(四)json解析
# json数据解析
translate_results = json.loads(html)['translateResult'][0] # 以json格式载入
print(translate_results)
(五)输出结果遍历,打印所有的翻译结果
# 输出结果遍历,打印所有的翻译结果
for result in translate_results:
print(result['tgt']) # 输出结果
(六)完整代码
from urllib import request, parse
import json
#地址
req_url = 'http://fanyi.youdao.com/translate'
# 创建要提交的数据
Form_Date = {}
Form_Date['i'] = input('请输入待查询字符:')
# Form_Date['i'] = 'hello,nice to meet you.' # 要翻译的内容可以更改
Form_Date['doctype'] = 'json'
data = parse.urlencode(Form_Date).encode('utf-8') # 数据转换
#爬取过程调用
response = request.urlopen(req_url, data) # 提交数据并解析
html = response.read().decode('utf-8') # 服务器返回结果读取
# json数据解析
translate_results = json.loads(html)['translateResult'][0] # 以json格式载入
print(translate_results)
# 输出结果遍历,打印所有的翻译结果
for result in translate_results:
print(result['tgt']) # 输出结果
(七)测试效果
整个实现过程自动检测,无需传输是否中转英或者英文转中文。
1、中文转英文
E:\Python37\python.exe D:/youdao02.py
请输入待查询字符:17.千金难买早知道,万金难买的是后悔药。18.卒子过河,意在吃帅。19.人生各有志。
[{'src': '17.千金难买早知道,万金难买的是后悔药。', 'tgt': "17. Money doesn't buy early know, describe a difficult to buy regret medicine."}, {'src': '18.卒子过河,意在吃帅。', 'tgt': '18. The pawn across the river to eat handsome.'}, {'src': '19.人生各有志。', 'tgt': '19. The aspiring of life.'}]
17. Money doesn't buy early know, describe a difficult to buy regret medicine.
18. The pawn across the river to eat handsome.
19. The aspiring of life.
2、英文转中文
E:\Python37\python.exe D:/youdao02.py
请输入待查询字符:Money doesn't buy early know, describe a difficult to buy regret medicine.
[{'src': "Money doesn't buy early know, describe a difficult to buy regret medicine.", 'tgt': '金钱买不来早知道,描述一个难买后悔药。'}]
金钱买不来早知道,描述一个难买后悔药。
Process finished with exit code 0
二、前端UI设计部分
初步实现的效果如下:
(一)实现效果
(二)引入主要的库
from tkinter import *
# 导入ttk
from tkinter import ttk
from tkinter import messagebox as msgbox
from tkinter import filedialog
from collections import OrderedDict
(三)初始化主窗口
root =Tk()
root.title("小型翻译软件V1.0版")
root.geometry('600x400')
(四)初始化两个text框
text =Text(root, height=12, width=60,
foreground='darkgray',
font=('微软雅黑',12),
spacing2=8,# 设置行间距
spacing3=12)# 设置段间距
text.pack(fill=BOTH,expand=Y)
st ='Tkinter 为菜单提供了 Menu 类,该类既可代表菜单条,也可代表菜单,还可代表上下文菜单(右键菜单)。简单来说,Menu 类就可以搞定所有菜单相关内容。\n'
text.insert(END, st)
scroll =Scrollbar(text, command=text.yview)
scroll.pack(side=RIGHT, fill=Y)
# 设置text2的纵向滚动影响scroll滚动条
text.configure(yscrollcommand=scroll.set)
text.configure(state=NORMAL)
lf = ttk.Labelframe(root, text='翻译区', padding=2)
text2 = Text(lf, height=12, width=60,
foreground='darkgray',
font=('微软雅黑', 12),
spacing2=8, # 设置行间距
spacing3=12) # 设置段间距
st ='这是一个翻译区,等待翻译数据中!!\n'
text2.insert(END, st)
text2.pack(fill=BOTH, expand=Y)
scroll2 = Scrollbar(text2, command=text2.yview)
scroll2.pack(side=RIGHT, fill=Y)
# 设置text2的纵向滚动影响scroll滚动条
text2.configure(yscrollcommand=scroll2.set)
(五)初始化菜单项
menubar =Menu(root)
root['menu']= menubar
file_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='文件', menu=file_menu)
fanyi_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='翻译区', menu=fanyi_menu)
fanyi2_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='翻译', menu=fanyi2_menu)
file_menu.add_command(label="新建", command=on_new)
file_menu.add_command(label="打开", command=on_open)
file_menu.add_command(label="保存", command=on_save)
file_menu.add_separator()
file_menu.add_command(label="退出", command=on_exit)
fanyi_menu.add_command(label="显示", command = on_change)
fanyi_menu.add_command(label="不显示", command = on_nochange)
fanyi2_menu.add_command(label="有道", command = on_chag)
(六)为各菜单项实现响应事件
def on_new():
text.delete(1.0,END)
def on_open():
localfile = filedialog.askopenfile(title='打开单个文件',
filetypes=[("文本文件","*.txt")],# 只处理的文件类型
initialdir='D:/')
if(localfile):
text.delete(1.0,END)
with open(localfile.name,'r',encoding='utf-8') as f:
txt = f.readlines()
print(txt)
for t in txt:
text.insert(END,t)
else:
msgbox.showinfo(message=('读取文件异常'))
def on_save():
localfile = filedialog.asksaveasfile(title='保存文件',
filetypes=[("文本文件", "*.txt")], # 只处理的文件类型
initialdir='D:/')
if(localfile):
txt = text.get(1.0,END)
print(txt)
with open(localfile.name,'w',encoding='utf-8') as f:
f.write(txt)
else:
msgbox.showinfo(message=('读取文件异常'))
def on_exit():
root.destroy()
(七)实现翻译区的显示和隐藏功能
#显示
def on_change():
# lf.pack(fill=BOTH, expand=YES, padx=10, pady=10)
lf.pack(fill=BOTH, expand=YES)
#隐藏
def on_nochange():
lf.pack_forget()
(八)完整的代码
from tkinter import *
# 导入ttk
from tkinter import ttk
from tkinter import messagebox as msgbox
from tkinter import filedialog
from collections import OrderedDict
def on_new():
text.delete(1.0,END)
def on_open():
localfile = filedialog.askopenfile(title='打开单个文件',
filetypes=[("文本文件","*.txt")],# 只处理的文件类型
initialdir='D:/')
if(localfile):
text.delete(1.0,END)
with open(localfile.name,'r',encoding='utf-8') as f:
txt = f.readlines()
print(txt)
for t in txt:
text.insert(END,t)
else:
msgbox.showinfo(message=('读取文件异常'))
def on_save():
localfile = filedialog.asksaveasfile(title='保存文件',
filetypes=[("文本文件", "*.txt")], # 只处理的文件类型
initialdir='D:/')
if(localfile):
txt = text.get(1.0,END)
print(txt)
with open(localfile.name,'w',encoding='utf-8') as f:
f.write(txt)
else:
msgbox.showinfo(message=('读取文件异常'))
def on_exit():
root.destroy()
#显示
def on_change():
# lf.pack(fill=BOTH, expand=YES, padx=10, pady=10)
lf.pack(fill=BOTH, expand=YES)
#隐藏
def on_nochange():
lf.pack_forget()
def on_chag():
pass
root =Tk()
root.title("小型翻译软件V1.0版")
root.geometry('600x400')
text =Text(root, height=12, width=60,
foreground='darkgray',
font=('微软雅黑',12),
spacing2=8,# 设置行间距
spacing3=12)# 设置段间距
text.pack(fill=BOTH,expand=Y)
st ='Tkinter 为菜单提供了 Menu 类,该类既可代表菜单条,也可代表菜单,还可代表上下文菜单(右键菜单)。简单来说,Menu 类就可以搞定所有菜单相关内容。\n'
text.insert(END, st)
scroll =Scrollbar(text, command=text.yview)
scroll.pack(side=RIGHT, fill=Y)
# 设置text2的纵向滚动影响scroll滚动条
text.configure(yscrollcommand=scroll.set)
text.configure(state=NORMAL)
lf = ttk.Labelframe(root, text='翻译区', padding=2)
text2 = Text(lf, height=12, width=60,
foreground='darkgray',
font=('微软雅黑', 12),
spacing2=8, # 设置行间距
spacing3=12) # 设置段间距
st ='这是一个翻译区,等待翻译数据中!!\n'
text2.insert(END, st)
text2.pack(fill=BOTH, expand=Y)
scroll2 = Scrollbar(text2, command=text2.yview)
scroll2.pack(side=RIGHT, fill=Y)
# 设置text2的纵向滚动影响scroll滚动条
text2.configure(yscrollcommand=scroll2.set)
menubar =Menu(root)
root['menu']= menubar
file_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='文件', menu=file_menu)
fanyi_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='翻译区', menu=fanyi_menu)
fanyi2_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='翻译', menu=fanyi2_menu)
file_menu.add_command(label="新建", command=on_new)
file_menu.add_command(label="打开", command=on_open)
file_menu.add_command(label="保存", command=on_save)
file_menu.add_separator()
file_menu.add_command(label="退出", command=on_exit)
fanyi_menu.add_command(label="显示", command = on_change)
fanyi_menu.add_command(label="不显示", command = on_nochange)
fanyi2_menu.add_command(label="有道", command = on_chag)
root.mainloop()
三、实现前后端交互
细心的朋友肯定发现了,在上述代码中有这样一段代码:
def on_chag():
pass
对的,这个地方就是我们现在准备要实现的代码。
为了更好的实现函数复用,我们需要先对第一部分中的代码进行改造,将其改造成函数。具体实现如下:
(一)爬虫函数化改造
from urllib import request, parse
import json
def parse(data):
#地址
req_url = 'http://fanyi.youdao.com/translate'
# 创建要提交的数据
Form_Date = {}
Form_Date['i'] = data
# Form_Date['i'] = 'hello,nice to meet you.' # 要翻译的内容可以更改
Form_Date['doctype'] = 'json'
data = parse.urlencode(Form_Date).encode('utf-8') # 数据转换
#爬取过程调用
response = request.urlopen(req_url, data) # 提交数据并解析
html = response.read().decode('utf-8') # 服务器返回结果读取
# json数据解析
translate_results = json.loads(html)['translateResult'][0] # 以json格式载入
# 输出结果遍历,打印所有的翻译结果
results = []
for result in translate_results:
results.append(result['tgt'])
return results
说明:输入为需要翻译的文本,输出为解析后的文本。
(二)on_chag调用
def on_chag():
str = text.get(0.0,END)
# myparse(str)
res = myparse(str)
print(res)
text2.delete(1.0, END)
on_change() #显示翻译区
for s in res:
text2.insert(END,s)
(三)完整代码
from tkinter import *
# 导入ttk
from tkinter import ttk
from tkinter import messagebox as msgbox
from tkinter import filedialog
from collections import OrderedDict
from urllib import request, parse
import json
def myparse(data):
#地址
req_url = 'http://fanyi.youdao.com/translate'
# 创建要提交的数据
Form_Date = {}
Form_Date['i'] = data
# Form_Date['i'] = 'hello,nice to meet you.' # 要翻译的内容可以更改
Form_Date['doctype'] = 'json'
data = parse.urlencode(Form_Date).encode('utf-8') # 数据转换
#爬取过程调用
response = request.urlopen(req_url, data) # 提交数据并解析
html = response.read().decode('utf-8') # 服务器返回结果读取
# json数据解析
translate_results = json.loads(html)['translateResult'][0] # 以json格式载入
# 输出结果遍历,打印所有的翻译结果
results = []
for result in translate_results:
results.append(result['tgt'])
return results
def on_new():
text.delete(1.0,END)
def on_open():
localfile = filedialog.askopenfile(title='打开单个文件',
filetypes=[("文本文件","*.txt")],# 只处理的文件类型
initialdir='D:/')
if(localfile):
text.delete(1.0,END)
with open(localfile.name,'r',encoding='utf-8') as f:
txt = f.readlines()
print(txt)
for t in txt:
text.insert(END,t)
else:
msgbox.showinfo(message=('读取文件异常'))
def on_save():
localfile = filedialog.asksaveasfile(title='保存文件',
filetypes=[("文本文件", "*.txt")], # 只处理的文件类型
initialdir='D:/')
if(localfile):
txt = text.get(1.0,END)
print(txt)
with open(localfile.name,'w',encoding='utf-8') as f:
f.write(txt)
else:
msgbox.showinfo(message=('读取文件异常'))
def on_exit():
root.destroy()
#显示
def on_change():
# lf.pack(fill=BOTH, expand=YES, padx=10, pady=10)
lf.pack(fill=BOTH, expand=YES)
#隐藏
def on_nochange():
lf.pack_forget()
def on_chag():
str = text.get(0.0,END)
# myparse(str)
res = myparse(str)
print(res)
text2.delete(1.0, END)
on_change() #显示翻译区
for s in res:
text2.insert(END,s)
root =Tk()
root.title("小型翻译软件V1.0版")
root.geometry('600x400')
text =Text(root, height=12, width=60,
foreground='darkgray',
font=('微软雅黑',12),
spacing2=8,# 设置行间距
spacing3=12)# 设置段间距
text.pack(fill=BOTH,expand=Y)
st ='Tkinter 为菜单提供了 Menu 类,该类既可代表菜单条,也可代表菜单,还可代表上下文菜单(右键菜单)。简单来说,Menu 类就可以搞定所有菜单相关内容。\n'
text.insert(END, st)
scroll =Scrollbar(text, command=text.yview)
scroll.pack(side=RIGHT, fill=Y)
# 设置text2的纵向滚动影响scroll滚动条
text.configure(yscrollcommand=scroll.set)
text.configure(state=NORMAL)
lf = ttk.Labelframe(root, text='翻译区', padding=2)
text2 = Text(lf, height=12, width=60,
foreground='darkgray',
font=('微软雅黑', 12),
spacing2=8, # 设置行间距
spacing3=12) # 设置段间距
st ='这是一个翻译区,等待翻译数据中!!\n'
text2.insert(END, st)
text2.pack(fill=BOTH, expand=Y)
scroll2 = Scrollbar(text2, command=text2.yview)
scroll2.pack(side=RIGHT, fill=Y)
# 设置text2的纵向滚动影响scroll滚动条
text2.configure(yscrollcommand=scroll2.set)
menubar =Menu(root)
root['menu']= menubar
file_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='文件', menu=file_menu)
fanyi_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='翻译区', menu=fanyi_menu)
fanyi2_menu =Menu(menubar, tearoff=0)
menubar.add_cascade(label='翻译', menu=fanyi2_menu)
file_menu.add_command(label="新建", command=on_new)
file_menu.add_command(label="打开", command=on_open)
file_menu.add_command(label="保存", command=on_save)
file_menu.add_separator()
file_menu.add_command(label="退出", command=on_exit)
fanyi_menu.add_command(label="显示", command = on_change)
fanyi_menu.add_command(label="不显示", command = on_nochange)
fanyi2_menu.add_command(label="有道", command = on_chag)
root.mainloop()
好吧,我自己发现有些小bug,大家可以自己尝试着完善一下。
这个过程是一种乐趣。希望大家喜欢!
你的支持和鼓励,是一种很大的动力,欢迎留言、点赞和加粉。
感谢,共勉、比心!