其实只是在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的小工具的更多相关文章

  1. python开发目录合并小工具 PathMerge

    前言 这个程序陆陆续续开发了几天,正好我在学Python,就一边做一边学,倒是学到不少东西. 不得不说python是快速开发的好工具. 程序做了一些改进,这两天又忙着毕设,现在才想起来发到博客上.想想 ...

  2. python 3.6 MJ小工具

    2017.07.14 update 做了个界面,不需要使用cmd命令行+文件路径的方式来使用了: 链接如下: http://www.cnblogs.com/chenyuebai/p/7150382.h ...

  3. 目不识丁的我使用Python编写汉字注音小工具

    一万点暴击伤害 人懒起来太可怕了,放了个十一充分激发了我的惰性.然后公众号就这么停了半个月,好惭愧- 新学期儿子的幼儿园上线了APP,每天作业通过app布置后,家长需要陪着孩子学习,并上传视频才算完成 ...

  4. Python: tkinter实例改名小工具

    #!/usr/bin/env python #coding=utf-8 # # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) # 本代码以MIT ...

  5. 入坑python 自己写的小工具,纪念一下

    这个程序的功能是可以从表格中读取某一列数据,传到IDs 这一个参数里,然后在url中获取相应的请求值,并打印 import urllib.request import json import xlrd ...

  6. python一些实用的小工具

    1  搭一个简易的本地局域网  python -m http.server 2 获取当前目录下的所有文件名 3 进度条效果 import sys,time for i in range(50): sy ...

  7. python之字符聊天小工具

    server side: # coding: gb2312#socket server端#获取socket构造及常量from socket import *#''代表服务器为localhostmyHo ...

  8. 几个可以提高工作效率的Python内置小工具

    在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...

  9. 【python】【开源】使用Tkinter和matplotlib实时显示图像,打造属于自己的性能测试小工具

    在腾讯的perfdog工具还未公开时,当时需要查看内存使用情况等信息,就用python写了个小工具 为了提升开发效率,就直接借用了雷子开源的性能测试工具的布局,自己美化了一下,然后加入了实时显示数据的 ...

随机推荐

  1. JS 中通过对象关联实现『继承』

    JS 中继承其实是种委托,而不是传统面向对象中的复制父类到子类,只是通过原型链将要做的事委托给父类. 下面介绍通过对象关联来实现『继承』的方法: Foo = { // 需要提供一个 init 方法来初 ...

  2. js中遍历对象的属性和值

    今天想看一下js的数组遍历的内容,搜索到了一个关于对象遍历写好的函数,保留一下.以后好用. function allPrpos ( obj ) {   // 用来保存所有的属性名称和值   var p ...

  3. TimeStamp

    private void Form1_Load(object sender, EventArgs e) { textBox1.Text= GenerateTimeStamp(System.DateTi ...

  4. MongoDB学习笔记八:复制

    [主从复制]最基本的复制方式就是建立一个主节点和一个或多个从节点,每个从节点要知道主节点的地址.运行mongod --master启动主服务器.运行mongod --slave --source ma ...

  5. Windows下面如何建立多个Django虚拟环境

    Linux 安装请见另一篇博客 http://www.cnblogs.com/zhaoyingjie/p/6180758.html 1.安装 virtualenv 2.安装virtualenvwrap ...

  6. Django中Form的Textarea字段

    开始以为是这个样子: class BlogForm(forms.Form): title    = forms.CharField(required = True) content  = forms. ...

  7. 用Join子句进行分组联接

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. InfoPi运行机制介绍

    整体工作框架 文件目录结构 数据库设计 程序开发框架 注:图片可能被自动缩小,可以另存看大图 1.整体工作框架. 通用户关注绿色竖线左侧的内容即可 2.InfoPi的文件目录结构. 请留意一下cfg目 ...

  9. C#四种深拷贝方法

    //四种深拷贝方法 public static T DeepCopyByReflect<T>(T obj) { //如果是字符串或值类型则直接返回 if (obj is string || ...

  10. JS正则截取两个字符串之间的字符串

    match方法 var str = "iid0000ffr"; var substr = str.match(/id(\S*)ff/); console.log(substr) 返 ...