Python实现翻译小工具(python打包成exe文件)

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:kaliarch
import requests
import urllib.parse
import time
import random
import hashlib
import json

class search(object):
    def __init__(self):
        self.url = 'http://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': 'http://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:kaliarch

import tkinter as tk
from fanyi import search

class 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:kaliarch

import sys
from cx_Freeze import setup,Executable

import 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 = None

if 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 sys
from 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 库可以实现此类转换,著名的有 py2exe、py2app、PyInstaller、cx_Freeze 等。其中,py2app 适用于 macOS,不在本文讨论范围内;py2exePyInstaller因为 Python 3.6 通过 PEP 523 等修改了代码对象(code object)的实现而暂未能继续支持。因此,cx_Freeze 属于目前可用的最佳方案之一。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容