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_())
python转exe的小工具的更多相关文章
- python开发目录合并小工具 PathMerge
前言 这个程序陆陆续续开发了几天,正好我在学Python,就一边做一边学,倒是学到不少东西. 不得不说python是快速开发的好工具. 程序做了一些改进,这两天又忙着毕设,现在才想起来发到博客上.想想 ...
- python 3.6 MJ小工具
2017.07.14 update 做了个界面,不需要使用cmd命令行+文件路径的方式来使用了: 链接如下: http://www.cnblogs.com/chenyuebai/p/7150382.h ...
- 目不识丁的我使用Python编写汉字注音小工具
一万点暴击伤害 人懒起来太可怕了,放了个十一充分激发了我的惰性.然后公众号就这么停了半个月,好惭愧- 新学期儿子的幼儿园上线了APP,每天作业通过app布置后,家长需要陪着孩子学习,并上传视频才算完成 ...
- Python: tkinter实例改名小工具
#!/usr/bin/env python #coding=utf-8 # # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) # 本代码以MIT ...
- 入坑python 自己写的小工具,纪念一下
这个程序的功能是可以从表格中读取某一列数据,传到IDs 这一个参数里,然后在url中获取相应的请求值,并打印 import urllib.request import json import xlrd ...
- python一些实用的小工具
1 搭一个简易的本地局域网 python -m http.server 2 获取当前目录下的所有文件名 3 进度条效果 import sys,time for i in range(50): sy ...
- python之字符聊天小工具
server side: # coding: gb2312#socket server端#获取socket构造及常量from socket import *#''代表服务器为localhostmyHo ...
- 几个可以提高工作效率的Python内置小工具
在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...
- 【python】【开源】使用Tkinter和matplotlib实时显示图像,打造属于自己的性能测试小工具
在腾讯的perfdog工具还未公开时,当时需要查看内存使用情况等信息,就用python写了个小工具 为了提升开发效率,就直接借用了雷子开源的性能测试工具的布局,自己美化了一下,然后加入了实时显示数据的 ...
随机推荐
- org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection 原因
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection 可能出现的原因 ...
- Bash Shell内建命令和保留字
Bash Shell内建命令和保留字命令含义!保留字,逻辑非:不做任何事,只做参数展开.读取文件并在shell中执行它alias设置命令或命令行别名bg将作业置于后台运行bind将关键字序列与read ...
- 使用 Fluent API 配置/映射属性和类型(摘自微软Data Access and Storage)
使用 Fluent API 配置/映射属性和类型 使用实体框架 Code First 时,默认行为是使用一组 EF 中内嵌的约定将 POCO 类映射到表.但是,有时您无法或不想遵守这些约定,需要将实体 ...
- mysql学习之触发器
在借阅表和读者表当中存在着这样的关系,如果在借阅表当中添加一条数据,读者表当中对应的累计借书字段就自增1,如果在借阅表当中删除一条数据,读者表当中对应的累计借书字段就自减1,实现本功能的方法如下. 1 ...
- zendstuido10 配置spket插件
必备:Zend Studio.Spket Plugin.sdk.jsb3.百度 安装过程中出现了两种错误,导致最后安装spket时报错,一种是提示“The file "F:\study\to ...
- Spring源码解析 - AntPathMatcher
文章摘要: 1. ant匹配规则 2. PathMatcher接口 3. 通过测试用例看AntPathMatcher的使用 ant匹配规则 AntPathMatcher如名使用的ant 的匹配规则,我 ...
- tomcat war部署根目录下
一个很取巧的办法,步骤如下: 1. 删除webapp下所有文件 cd ${TOMAT_HOME}/webapps && rm -rf * 2. copy待部署war到webapps目录 ...
- 6、Samba 服务器配置
1.安装samba服务 [root@rhel6_80 samba]# yum -y install samba #安装samba [root@rhel6_80 samba]# rpm -qa |gre ...
- Web API数据传输加密
http://www.cnblogs.com/wuhuacong/p/4620300.html Web API应用架构设计分析(2) 在上篇随笔<Web API应用架构设计分析(1)>, ...
- 【MVC】ASP.NET MVC Forms验证机制
http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121 文章 - 0 评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...