开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 37743|回复: 16
收起左侧

[图文教程] 用易函数视窗编程系统开发一键编译任意python脚本工具

[复制链接]
发表于 2021-7-14 11:03:46 | 显示全部楼层 |阅读模式   广东省广州市
0.png

用易函数视窗编程系统开发一键编译任意python脚本工具

工具下载

百度网盘 https://pan.baidu.com/s/1Nccbrh23070PBCs7eAl4fA提取码: p4qb

  • efun_bulid_view.exe 易函数一键编译任意python脚本工具

视频讲解

用易函数将任意python文件编译为exe

用易函数视窗编程系统开发一键编译任意python脚本工具

如何开发的?

我们来讲解一下易函数视窗编程系统是如何开发应用的

1. 界面设计

打开易函数视窗编程系统的界面设计器

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(编译目录=编译目录, 新目录名称=新目录名称))
    )

评分

参与人数 5好评 +5 精币 +11 收起 理由
kspz + 1 + 2 支持开源~!感谢分享
傻妞 + 1 + 2 支持开源~!感谢分享
ノ朽默℡ + 1 + 1 新技能已get√
汉族 + 1 + 3 新技能已get√
1185384801 + 1 + 3 新技能已get√

查看全部评分

签到天数: 1 天

发表于 2022-10-4 00:03:46 | 显示全部楼层   湖南省株洲市
太牛了。。这也
回复 支持 反对

使用道具 举报

发表于 2022-9-30 11:49:49 | 显示全部楼层   四川省遂宁市

厉害啊~学习到了~
回复 支持 反对

使用道具 举报

发表于 2022-9-28 16:59:59 | 显示全部楼层   广东省广州市
666666666666666666666666666666666
回复 支持 反对

使用道具 举报

结帖率:70% (7/10)

签到天数: 3 天

发表于 2021-7-18 21:03:57 | 显示全部楼层   湖南省长沙市
niubi asdsssssssssssss
回复 支持 反对

使用道具 举报

发表于 2021-7-17 15:36:38 | 显示全部楼层   浙江省金华市
不错不错。。支持
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 11 天

发表于 2021-7-15 15:40:52 | 显示全部楼层   河南省洛阳市
这个牛X啊  期待更简单易用  
回复 支持 反对

使用道具 举报

发表于 2021-7-15 14:17:21 | 显示全部楼层   安徽省合肥市
谢谢分享,下载学习!!!!
回复 支持 反对

使用道具 举报

发表于 2021-7-15 14:07:24 | 显示全部楼层   广东省深圳市
大神级别
回复 支持 反对

使用道具 举报

签到天数: 16 天

发表于 2021-7-15 13:49:06 | 显示全部楼层   重庆市重庆市
必须牛逼
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表