🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 用易函数视窗编程系统开发一键编译任意python脚本工具 工具下载 [百度网盘 https://pan.baidu.com/s/1Nccbrh23070PBCs7eAl4fA](https://pan.baidu.com/s/1Nccbrh23070PBCs7eAl4fA)提取码: p4qb * efun_bulid_view.exe 易函数一键编译任意python脚本工具 ![](https://img.kancloud.cn/cf/40/cf40be56269b0683d342c64291be86df_895x551.png) ## 视频讲解 [用易函数将任意python文件编译为exe](https://www.bilibili.com/video/BV1Hh41167Yt) [用易函数视窗编程系统开发一键编译任意python脚本工具](https://www.bilibili.com/video/BV1T64y1X7vB) # 如何开发的? 我们来讲解一下易函数视窗编程系统是如何开发应用的 ## 1. 界面设计 打开易函数视窗编程系统的界面设计器 ![](https://img.kancloud.cn/2e/34/2e347a401620c6a6c6d985b0f9c32849_2041x1148.png) ## 2, 编写功能代码 ``` import pyefun.wxefun as wx import pyefun as efun import pyefun.compile as compile import webbrowser class FileDrop(wx.FileDropTarget): def __init__(self): wx.FileDropTarget.__init__(self) def OnDropFiles(self, x, y, filePath): 文件路径 = filePath[0] G.app.窗口1.选择编译文件路径(文件路径) return True compile.隐藏控制台窗口() class 窗口1(wx.窗口): def __init__(self): self.初始化界面() def 初始化界面(self): #########以下是创建的组件代码######### wx.窗口.__init__(self, None, title='易函数一键编译任意python脚本工具 易函数代码仓库:https://gitee.com/duolabmeng666/pyefun', size=(732, 450), name='frame', style=541072449) self.容器 = wx.容器(self) self.Centre() self.窗口1 = self self.窗口1.播放次数 = wx.播放次数.循环播放 self.窗口1.位置 = wx.窗口位置.通常 self.标签1 = wx.标签(self.容器, size=(151, 32), pos=(6, 13), label='欲编译的python文件路径', style=2321) self.编辑框_文件路径 = wx.编辑框(self.容器, size=(459, 32), pos=(162, 6), value='', style=0) self.编辑框_文件路径.最大允许长度 = 0 self.按钮_选择python文件 = wx.按钮(self.容器, size=(67, 32), pos=(637, 7), label='选择') self.按钮_选择python文件.绑定事件(wx.事件.被单击, self.按钮_选择python文件_被单击) self.编辑框_日志框 = wx.编辑框(self.容器, size=(700, 180), pos=(6, 226), value='', style=1073741856) self.编辑框_日志框.最大允许长度 = 0 self.编辑框_可执行文件路径 = wx.编辑框(self.容器, size=(459, 32), pos=(162, 88), value='', style=0) self.编辑框_可执行文件路径.最大允许长度 = 0 self.按钮_选课可执行文件 = wx.按钮(self.容器, size=(67, 32), pos=(637, 87), label='选择') self.按钮_选课可执行文件.绑定事件(wx.事件.被单击, self.按钮_选课可执行文件_被单击) self.按钮_打开应用目录 = wx.按钮(self.容器, size=(140, 28), pos=(6, 46), label='打开编译目录') self.按钮_打开应用目录.绑定事件(wx.事件.被单击, self.按钮_打开应用目录_被单击) self.组合框1 = wx.组合框(self.容器, value='', pos=(7, 140), choices=[], style=wx.CB_READONLY) self.组合框1.SetSize((140, 25)) self.组合框1.置列表项目(['mingw64编译器', 'mingw32编译器']) self.按钮_执行查找依赖 = wx.按钮(self.容器, size=(140, 28), pos=(6, 90), label='执行查找依赖') self.按钮_执行查找依赖.绑定事件(wx.事件.被单击, self.按钮_执行查找依赖_被单击) self.选择框_编译 = wx.选择框(self.容器, size=(140, 30), pos=(162, 140), label='编译', style=wx.CHK_2STATE) self.选择框_自动查找依赖 = wx.选择框(self.容器, size=(140, 30), pos=(363, 140), label='自动查找依赖', style=wx.CHK_2STATE) self.按钮_写出编译脚本 = wx.按钮(self.容器, size=(140, 28), pos=(564, 183), label='写出编译脚本') self.按钮_写出编译脚本.绑定事件(wx.事件.被单击, self.按钮_写出编译脚本_被单击) self.编辑框_编译目录 = wx.编辑框(self.容器, size=(459, 32), pos=(162, 47), value='', style=0) self.编辑框_编译目录.最大允许长度 = 0 self.按钮7 = wx.按钮(self.容器, size=(67, 32), pos=(637, 48), label='选择') self.按钮7.绑定事件(wx.事件.被单击, self.按钮_选择编译目录_被单击) self.按钮_自动检查编译环境 = wx.按钮(self.容器, size=(140, 28), pos=(6, 183), label='自动检查编译环境') self.按钮_自动检查编译环境.绑定事件(wx.事件.被单击, self.按钮_查看环境_被单击) self.按钮_开始编译 = wx.按钮(self.容器, size=(140, 28), pos=(564, 140), label='开始执行') self.按钮_开始编译.绑定事件(wx.事件.被单击, self.按钮_开始编译_被单击) self.标签2 = wx.标签(self.容器, size=(171, 19), pos=(162, 188), label='如需帮助请看易函数的帮助文档', style=2321) self.标签2.字体 = wx.Font(9, 74, 90, 400, True, 'Microsoft YaHei UI', 28) self.标签2.绑定事件(wx.事件.鼠标左键被按下, self.标签2_鼠标左键被按下) self.标签3 = wx.标签(self.容器, size=(176, 19), pos=(359, 188), label='提问请到易函数的github或码云', style=2321) self.标签3.字体 = wx.Font(9, 74, 90, 400, True, 'Microsoft YaHei UI', 28) self.标签3.绑定事件(wx.事件.鼠标左键被按下, self.标签3_鼠标左键被按下) #########以上是创建的组件代码########## self.组合框1.置选中项(0) self.选择框_编译.置选中状态(True) self.选择框_自动查找依赖.置选中状态(True) # 注册拖放文件对象 self.fileDrop = FileDrop() self.SetDropTarget(self.fileDrop) #########以下是组件绑定的事件代码######### def 按钮_选择python文件_被单击(self, event): print("按钮_选择python文件_被单击") 文件路径 = wx.组件_文件选择器() self.选择编译文件路径(文件路径) def 选择编译文件路径(self, 文件路径): self.编辑框_文件路径.内容 = 文件路径 编译目录 = efun.路径优化(efun.文件_取目录(文件路径) + r"/o") self.编辑框_编译目录.内容 = 编译目录 文件名 = efun.strCut(efun.文件_取文件名(文件路径), "$.") 文件运行路径 = efun.路径优化(r"{1}\{0}.dist\{0}.exe".format(文件名, 编译目录)) self.编辑框_可执行文件路径.内容 = 文件运行路径 def 按钮_选择编译目录_被单击(self, event): print("按钮_选择编译目录_被单击") 文件路径 = wx.组件_目录选择器() self.编辑框_编译目录.内容 = 文件路径 def 按钮_查看环境_被单击(self, event): self.选择编译器() print("按钮_查看环境_被单击") if compile.初始化编译环境(): 输入到日志窗口("编译器准备完毕") else: 输入到日志窗口("自动准备编译器失败了 请配置好 python环境") list = [ "运行目录 " + efun.取运行目录(), "gcc版本 " + compile.取gcc版本(), "nuitka版本 " + compile.取nuitka版本(), "python版本 " + compile.取python版本(), "python路径 " + compile.取python执行路径(), "python包路径 " + compile.取pythonSitePackages目录(), ] print(list) wx.MessageBox("\n".join(list)) def 按钮_打开应用目录_被单击(self, event): print("按钮_打开应用目录_被单击") compile.运行命令("explorer.exe " + self.编辑框_编译目录.内容) def 选择编译器(self): item = self.组合框1.取选中项文本() if item == "mingw64编译器": pass 编译器目录 = efun.路径优化(efun.取运行目录() + "/bulidLib/mingw64/bin") if not efun.文件是否存在(编译器目录): 编译器目录 = "" if item == "mingw32编译器": pass 编译器目录 = efun.路径优化(efun.取运行目录() + "/bulidLib/mingw32/bin") if not efun.文件是否存在(编译器目录): 编译器目录 = "" if 编译器目录 != "": compile.编译器配置.默认编译器路径 = 编译器目录 def 按钮_开始编译_被单击(self, event): if self.编辑框_文件路径.内容 == "": return if self.编辑框_编译目录.内容 == "": return 文件路径 = self.编辑框_文件路径.内容 编译目录 = self.编辑框_编译目录.内容 文件目录 = efun.路径优化(efun.文件_取目录(文件路径)) 文件名 = efun.strCut(efun.文件_取文件名(文件路径), "$.") if 编译目录 == "": 编译目录 = efun.路径优化(efun.文件_取目录(文件路径) + r"/o") 文件运行路径 = efun.路径优化(r"{1}\{0}.dist\{0}.exe".format(文件名, 编译目录)) self.编辑框_可执行文件路径.内容 = 文件运行路径 self.选择编译器() print("按钮_开始编译_被单击") if compile.初始化编译环境(): 输入到日志窗口("编译器准备完毕") 输入到日志窗口("开始编译") 不编译 = self.选择框_编译.是否选中() == False 不寻找依赖 = self.选择框_自动查找依赖.是否选中() == False compile.编译文件( self.编辑框_文件路径.内容, 编译目录=self.编辑框_编译目录.内容, 编译器目录="", 不编译=不编译, 不寻找依赖=不寻找依赖 ) else: 输入到日志窗口("自动准备编译器失败了 请配置好 python环境") def 按钮_执行查找依赖_被单击(self, event): print("按钮_执行查找依赖_被单击") 文件运行路径 = self.编辑框_可执行文件路径.内容 文件运行目录 = efun.文件_取目录(文件运行路径) while compile.自动处理依赖缺失问题(文件运行路径, 文件运行目录): pass def 按钮_选课可执行文件_被单击(self, event): print("按钮_选课可执行文件_被单击") 文件路径 = wx.组件_文件选择器() self.编辑框_可执行文件路径.内容 = 文件路径 def 按钮_写出编译脚本_被单击(self, event): print("按钮_写出编译脚本_被单击") 模板文件 = "" + efun.读入文本(efun.路径优化(efun.取运行目录() + "/resources/scriptTpl.py")) 模板文件 = efun.子文本替换(模板文件, r'{{文件路径}}', self.编辑框_文件路径.内容) 模板文件 = efun.子文本替换(模板文件, r'{{编译目录}}', self.编辑框_编译目录.内容) 文件名 = efun.文件_取文件名(self.编辑框_文件路径.内容, False) 目录 = efun.文件_取目录(self.编辑框_文件路径.内容) 编译文件路径 = efun.路径优化(目录 + "/编译脚本_{}.py".format(文件名)) if not efun.文件是否存在(编译文件路径): efun.写到文件(编译文件路径, 模板文件) 输入到日志窗口("编译脚本写出到 {}".format(编译文件路径)) else: 输入到日志窗口("编译文件已存在 {} 请删除后再生成".format(编译文件路径)) def 标签2_鼠标左键被按下(self, event): print("标签2_鼠标左键被按下") webbrowser.open('https://www.kancloud.cn/duolabmeng/pyefundoc/content') def 标签3_鼠标左键被按下(self, event): print("标签3_鼠标左键被按下") webbrowser.open('https://gitee.com/duolabmeng666/pyefun') #########以上是组件绑定的事件代码######### class 应用(wx.App): def OnInit(self): self.窗口1 = 窗口1() self.窗口1.Show(True) return True class 全局变量: app = None isinstance(app, 应用) G = 全局变量 def 输入到日志窗口(text): pass # print(text) if (efun.取文本长度(G.app.窗口1.编辑框_日志框.内容) > 10000): G.app.窗口1.编辑框_日志框.内容 = "" G.app.窗口1.编辑框_日志框.write(efun.取现行时间().到文本() + " " + text + "\n") wx.GetApp().Yield() compile.日志.设置日志回调函数(输入到日志窗口) if __name__ == '__main__': G.app = 应用() G.app.MainLoop() ``` ## 编译脚本的编写 ``` import pyefun as efun import pyefun.compile as compile if compile.初始化编译环境(): 文件路径 = r"C:\pyefun\wxview\efun_bulid_view\efun_bulid_view.py" 编译目录 = r"C:\pyefun\wxview\efun_bulid_view\o" compile.编译文件( 文件路径=文件路径, 编译目录=编译目录, # 不编译=True, # 不寻找依赖=True, ) ##########编译完成后进行的操作########## ## 先删除原来的目录再改名 新目录名称 = r"efun_bulid_view" 运行目录 = efun.文件_取目录(文件路径) 文件名 = efun.文件_取文件名(文件路径, False) efun.删除目录(r"{编译目录}\{新目录名称}".format(编译目录=编译目录, 新目录名称=新目录名称)) # 修改编译后的文件目录名称 efun.文件更名( efun.路径优化(r"{编译目录}\{文件名}.dist".format(编译目录=编译目录, 文件名=文件名)), efun.路径优化(r"{编译目录}\{新目录名称}".format(编译目录=编译目录, 新目录名称=新目录名称)) ) # 将编译后运行所需要的资源复制到编译后的目录 efun.复制目录( efun.路径优化(r"{}/bulidLib".format(运行目录)), efun.路径优化(r"{编译目录}/{新目录名称}/bulidLib".format(编译目录=编译目录, 新目录名称=新目录名称)) ) ```