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

本文章为: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,大家可以自己尝试着完善一下。
这个过程是一种乐趣。希望大家喜欢!

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

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值