欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tkinter桌面+爬虫request让你也可以轻松设计精美的中英文翻译软件

程序员文章站 2022-05-28 21:31:05
...

本文章为: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设计部分

初步实现的效果如下:

(一)实现效果

tkinter桌面+爬虫request让你也可以轻松设计精美的中英文翻译软件

(二)引入主要的库

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()

tkinter桌面+爬虫request让你也可以轻松设计精美的中英文翻译软件

好吧,我自己发现有些小bug,大家可以自己尝试着完善一下。
这个过程是一种乐趣。希望大家喜欢!

你的支持和鼓励,是一种很大的动力,欢迎留言、点赞和加粉。
感谢,共勉、比心!