zoukankan      html  css  js  c++  java
  • python转exe的小工具

    其实只是在cxfreeze的基础上加了个壳,做成窗口软件了

    使用了pyqt做的界面,软件发布在了开源中国上,可以直接去下面的地址查看

    http://git.oschina.net/robocky/py2exe_win

    """
    Module implementing DPy2Exe.
    """
    
    from PyQt5.QtCore import pyqtSlot
    from PyQt5.QtWidgets import QDialog, QMessageBox, QFileDialog
    
    from Ui_wmain import Ui_Dialog
    
    import pickle, sys
    from cx_Freeze import main
    from os import path
    
    
    class DPy2Exe(QDialog, Ui_Dialog):
        """
        python文件生成exe
        """
        def __init__(self, parent=None):
            """
            默认初始化
            """
            super(DPy2Exe, self).__init__(parent)
            self.setupUi(self)
            self.setKeys = ['target-name', 'target-dir', 'base-name', 'icon']
            self.setting = dict(zip(self.setKeys, ('', 'dist', '', '')))
            self.setting['script'] = ''
            self.setting['useDefDir'] = True
            self.setting['useWin'] = True
            self.updateSetting()
            
        def getExeName(self, filename):
            '获得文件的默认exe名称'
            return '.'.join(path.basename(filename).split('.')[:-1])
        
        @pyqtSlot()
        def on_btnScript_clicked(self):
            """
            脚本浏览
            """
            filename, filter = QFileDialog.getOpenFileName(self, "从文件获取参数", self.leScript.text(), "参数文件 (*.py *.pyw)")
            if not filename: return
            self.leScript.setText(filename)
            #生成默认可执行文件名
            self.leTargetName.setText(self.getExeName(filename))
        
        @pyqtSlot(bool)
        def on_cbUseDefDir_clicked(self, checked):
            """
            是否使用默认目录
            """
            self.setting['useDefDir'] = checked
            if checked:
                self.leTargetDir.setEnabled(False)
                self.btnTargetDir.setEnabled(False)
            else:
                self.leTargetDir.setEnabled(True)
                self.btnTargetDir.setEnabled(True)
            
        @pyqtSlot(bool)
        def on_cbUseWin_clicked(self, checked):
            '是否使用窗口'
            self.setting['useWin'] = checked
        
        @pyqtSlot()
        def on_btnTargetDir_clicked(self):
            """
            目标目录浏览
            """
            dirName = QFileDialog.getExistingDirectory(self, "选择目标目录", path.dirname(self.leScript.text()),
                QFileDialog.Options(QFileDialog.ShowDirsOnly))
            if not dirName: return
            self.leTargetDir.setText(dirName)
        
        @pyqtSlot()
        def on_btnIcon_clicked(self):
            """
            图标浏览
            """
            filename, filter = QFileDialog.getOpenFileName(self, "图标选取", self.leScript.text(), "图标文件 (*.ico)")
            if not filename: return
            self.leIcon.setText(filename)
        
        @pyqtSlot()
        def on_btnOpen_clicked(self):
            """
            打开
            """
            filename, filter = QFileDialog.getOpenFileName(self, "文件生成数据", "", "数据文件 (*.p2e)")
            if not filename: return
            setdict = pickle.load(open(filename, 'rb'))
            for key in setdict:
                self.setting[key] = setdict[key]
            self.updateSetting()
        
        @pyqtSlot()
        def on_btnSave_clicked(self):
            """
            保存
            """
            filename, filter = QFileDialog.getSaveFileName(self, "文件生成数据", "newprj", "数据文件 (*.p2e)")
            if not filename: return
            self.getSetting()
            pickle.dump(self.setting, open(filename, 'wb'))
        
        @pyqtSlot()
        def on_btnGenerate_clicked(self):
            """
            生成
            """
            # 设定设置值
            self.getSetting()
            #如果没有主脚本则提示并返回
            if not path.exists(self.setting['script']):
                QMessageBox.warning(self, '主代码错误', '缺少主代码,或者主代码不存在!')
                return            
            argv = [self.setting['script']]
            for key in self.setKeys:
                if self.setting[key]:
                    argv.append('--' + key)
                    argv.append(self.setting[key])
            sys.argv[1:] = argv
            curstdout = sys.stdout
            curstderr = sys.stderr
            logfile = open('genmsg.log', 'w')
            sys.stderr = sys.stdout = logfile
            print(argv)
            try:
                main()
            except:
                QMessageBox.warning(self, '生成错误', str(sys.exc_info()[1]))
            else:
                QMessageBox.information(self, '生成成功', '成功生成exe文件!')
            sys.stdout = curstdout
            sys.stderr = curstderr
            logfile.close()
            
        def getSetting(self):
            '从界面中获取设定值'
            self.setting['script'] = self.leScript.text()
            #如果选用默认目录则用脚本目录下的dist目录
            if self.setting['useDefDir']:
                self.setting['target-dir'] = path.dirname(self.setting['script']) + '/dist'
            else:
                self.setting['target-dir'] = self.leTargetDir.text()
            self.setting['base-name'] = 'Win32GUI' if self.setting['useWin'] else ''
            #判断当前的应用程序名称是否为默认值
            if self.leTargetName.text() and self.leTargetName.text() != self.getExeName(self.setting['script']):
                self.setting['target-name'] = self.leTargetName.text() + '.exe'
            else:
                self.setting['target-name'] = ''
            self.setting['icon'] = self.leIcon.text()
            
        def updateSetting(self):
            '将设定值更新到界面中'
            self.leScript.setText(self.setting['script'])
            self.leTargetDir.setText(self.setting['target-dir'])
            self.leTargetName.setText(self.getExeName(self.setting['target-name']))
            self.leIcon.setText(self.setting['icon'])
            self.cbUseDefDir.setChecked(self.setting['useDefDir'])
            self.cbUseWin.setChecked(self.setting['useWin'])
            if self.setting['useDefDir']:
                self.leTargetDir.setEnabled(False)
                self.btnTargetDir.setEnabled(False)
            else:
                self.leTargetDir.setEnabled(True)
                self.btnTargetDir.setEnabled(True)
    
    if __name__ == "__main__":
        import sys
        from PyQt5.QtWidgets import QApplication
        app = QApplication(sys.argv)
        dlg = DPy2Exe()
        dlg.show()
        sys.exit(app.exec_())
  • 相关阅读:
    「网络流 24 题」魔术球
    「网络流 24 题」圆桌聚餐
    「网络流 24 题」最小路径覆盖
    「网络流 24 题」太空飞行计划
    「网络流 24 题」搭配飞行员
    「网络流 24 题」负载平衡
    「网络流 24 题」数字梯形
    餐巾计划问题
    让Double类型完整显示,不用科学计数法显示E
    kotlin新工程
  • 原文地址:https://www.cnblogs.com/lancky/p/5642420.html
Copyright © 2011-2022 走看看