码迷,mamicode.com
首页 > 编程语言 > 详细

python转exe的小工具

时间:2016-07-05 10:01:22      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:

其实只是在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_())

 

python转exe的小工具

标签:

原文地址:http://www.cnblogs.com/lancky/p/5642420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!