摘要:本文主要向大家介绍了Python语言实现翻译小工具(Python打包成exe文件),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。
本文主要向大家介绍了Python语言实现翻译小工具(Python打包成exe文件),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。
1.环境
windows10
python3.5(电脑上安装的是python的集成环境anaconda2,而且python3.5不是默认的环境)
2.原理
利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面。
3.目录结构
图片.png
4.代码
fangyi.py代码如下:
#!/bin/env python# -*- coding:utf-8 -*-# _author:kaliarchimport requests
import urllib.parse
import time
import random
import hashlib
import jsonclass search(object):
def __init__(self): self.url = '//fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
def getData(self,search_name): # salt =i = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)
salt = ((time.time() * 1000) + random.randint(1,10)) # sign = n.md5("fanyideskweb" + t + i + "ebSeFb%=XZ%T[KZ)c(sy!")
sign_text = "fanyideskweb" + search_name + str(salt) + "ebSeFb%=XZ%T[KZ)c(sy!"
sign = hashlib.md5((sign_text.encode('utf-8'))).hexdigest()
paydata = { 'i': search_name, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt, 'sign': sign, 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_CLICKBUTTION', 'typoResult': 'false'
} return paydata def getHeader(self):
header = { 'Host': 'fanyi.youdao.com', 'Referer': '//fanyi.youdao.com/', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 'Cookie': 'OUTFOX_SEARCH_USER_ID=-846616837@1.80.219.201; OUTFOX_SEARCH_USER_ID_NCOO=129549097.60835753; UM_distinctid=15ff309f18ddc-094cb5494ad815-5d4e211f-1fa400-15ff309f18e449; _ga=GA1.2.184261795.1517119351; __guid=204659719.2556877880764680700.1518435624954.942; JSESSIONID=aaa3A5BLhtTrh4TPX_mgw; monitor_count=2; ___rl__test__cookies=1518488731567'
} return header def getRequest(self,paydata,header):
_data = urllib.parse.urlencode(paydata).encode('utf-8')
_header = header
response = requests.post(self.url,data=_data,headers=_header) return response.text def getResult(self,response):
result_text = json.loads(response) #src = result_text['translateResult'][0][0]['src']
tgt = result_text['translateResult'][0][0]['tgt'] return tgt def main(self,search_name):
app = search()
paydata = app.getData(search_name)
header = app.getHeader()
response = app.getRequest(paydata, header)
tgt = app.getResult(response) return tgt
windows.py代码如下:
#!/bin/env python# -*- coding:utf-8 -*-# _author:kaliarchimport tkinter as tk
from fanyi import searchclass application:
def __init__(self): self.windows = tk.Tk() self.windows.title("翻译小工具") self.windows.geometry("280x350+700+300") #提交按钮
self.submit_btn = tk.Button(self.windows, text="查询",command=self.submit) self.submit_btn.place(x=220, y=10, width=50, height=25) # 定义输入框
self.entry = tk.Entry(self.windows) self.entry.place(x=10, y=10, width=200, height=40) #输出内容
self.result_text = tk.Text(self.windows, background="#ccc") self.result_text.place(x=10, y=90, width=260, height=245) # 翻译结果标题
self.title_label = tk.Label(self.windows, text="翻译结果:") self.title_label.place(x=10, y=65) self.search_result = search() def submit(self): #1.获取用户输入
context = self.entry.get() #2.利用有道翻译
result = self.search_result.main(context) #3.输出
self.result_text.delete(1.0,tk.END) self.result_text.insert(tk.END,result) def run(self): self.windows.mainloop()if __name__ == '__main__':
winapp = application()
winapp.run()
此时运行windows.py会出现界面,而且翻译可用。
图片.png
setup.py代码如下:
# -*- coding:utf-8 -*-# _author:kaliarchimport sysfrom cx_Freeze import setup,Executableimport os
os.environ['TCL_LIBRARY'] = r"C:\Users\JayMo\Anaconda2\envs\py35\tcl\tcl8.6"os.environ['TK_LIBRARY'] = r"C:\Users\JayMo\Anaconda2\envs\py35\tcl\tk8.6"include_files = [ r"C:\Users\JayMo\Anaconda2\envs\py35\DLLs\tcl86t.dll", r"C:\Users\JayMo\Anaconda2\envs\py35\DLLs\tk86t.dll",
]
build_exe_options = { "packages":["os","tkinter","requests","idna"], "include_files":include_files
}
base = Noneif sys.platform == "win32":
base = "Win32GUI"setup(name = "translate_tool",
version = "0.1",
description = "fanyitools!",
options = {"build_exe":build_exe_options},
executables = {Executable("windows.py",base=base)}
)
其中:
os.environ['TCL_LIBRARY']
os.environ['TK_LIBRARY']
include_files
的四个目录路径我用everthing软件搜索:如搜索:tk8.6:
图片.png
然后选择对应的路径,比如我的是第一个。
setup.py是利用cx_Freeze打包成windows的mis安装小程序,方便使用
切换到项目目录下执行
python setup.py bdist_msi
待执行完毕,可以项目文件下生成两个文件夹dist中为msi安装文件,在其他windows服务器安装后就为build下的文件内容,在build下的exe.win-amd64-3.6下的windows.exe 就可打开小工具
【注意:】要切换到python3.5,否则还要安装用到的包。
生成exe文件后目录.png
5.cx_Freeze 原理
cx_Freeze 需要通过一个简单的安装脚本来进行构建。一般来说,只要 Python 脚本本身能无错运行在自身环境,且 cx_Freeze distutils 安装脚本配置得当,那么构建出的可执行文件就能在任何相同操作系统下运行。作为开始,首先充分调试自己的 Python 脚本(不妨假设其名为 main.py)。main.py 允许从任何库或其他脚本中导入,甚至用 os.system() 或 subprocess.run() 等调用其他程序。确认无误后,在 windows.py 所在目录下新建一个较简单的 cx_Freeze 脚本,不妨假设其名为 setup.py,内容如下:
import sysfrom cx_Freeze import setup, Executable# Dependencies are automatically detected, but it might need fine tuning.build_exe_options = {'packages': [], 'excludes': []}
setup( name = '<程序名>',
version = '<程序版本>',
description = '<程序描述>',
options = {'build_exe': build_exe_options},
executables = [Executable('main.py')])
可见其基本遵照了官方文档的示例,并去除了一些暂时用不到的语句。其中,build_exe_options 暂时留空,待第一次构建后根据可能的报错信息补充;原例中的 base 实际上默认就是 None,即命令行程序,除非需要构建图形界面程序,否则配置了反而是画蛇添足。现在可以打开命令行终端,在此目录下运行
python setup.py build
由于 cx_Freeze 在编译时,实际上是将全部导入库都编译了一遍并放在子目录中供主程序调用,从而真正独立于 Python 环境。其自称能够自动分析哪些库需要包含。然而事实上对深入一定层次后的导入分析有瑕疵(例如 windows.py 引用了一个库,该库又引用了另一个库,则第三个库有可能分析不出)。遇到这种错误,绝大多数情况下可以手动在 setup.py 中指定额外包含的库,既可以在 build_exe_options 下的 'packages' 中指定库名,也可以在 build_exe_options 中新建一个键名为 'includes' 然后指定库名,形如:
build_exe_options = { 'packages': ['tkinter', 'scipy'],
'includes': ['numpy.core._methods']
}
这个过程有时要重复多次,直到添加完所有<del>届不到</del>不能自动检测到的库。据说也可以直接在 setup.py 中导入(import)库,未亲测。个别特例无效,请继续阅读。
本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号