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写了个小工具 为了提升开发效率,就直接借用了雷子开源的性能测试工具的布局,自己美化了一下,然后加入了实时显示数据的 ...
随机推荐
- Android 中算法问题
1:冒泡排序: 冒泡排序的思路: 相邻的两个数进行比较 (1):首先需要连个for 循环 (2):最外层for 循环控制最里面 for 循环的循环次数 (3):通过设置中间参数的方式进行交换 (4): ...
- wget 递归下载整个网站
wget -r -p -np -k http://xxx.com/xxx -r, --recursive(递归) specify recursive download.(指定递归下 ...
- mysql之高可靠
6.mysql主-从备份 主-主备份,首先AB机要保持数据一致,即先手工备份A机数据,然后在B机上恢复,之后就很简单了,只需要在B机上创建一个同步账号,并在A机上输入B机的那些参数然后启动slave ...
- MySQL Innodb数据库性能实践——热点数据性能
摘要: 对于大部分的应用来说,都存在热点数据的访问,即:某些数据在一定时间内的访问频率要远远高于其它数据. 常见的热点数据有“最新的新闻”.“最热门的新闻”.“下载量最大”的电影等. 为了了解MySQ ...
- 让CSS布局更加直观:box-sizing
让CSS布局更加直观:box-sizing 如果你写过CSS或者你接触过CSS,相信你一定对盒子模型一点都不陌生.CSS其中一个让人比较困惑的地方就在于它的盒子模型中关于高度和宽度的计算,别说那些初学 ...
- [Linux] - CentOS IP设置方法
CentOS 7的IP设置方法: 1.手动设置IP方法 a) 运行命令,cd到目录: cd /etc/sysconfig/network-scripts/ b) 运行命令:ls -l 找到类似这个文件 ...
- nodejs向远程服务器发送post请求----融云Web SDK/客户端获取token
最近要用到一个叫融云的及时通讯的SDK,在获取token这个步骤的时候有点卡顿,以防以后碰到类似的问题,再此记录一下. 客户端通过融云 SDK 每次连接服务器时,都需要向服务器提供 Token,以便验 ...
- float、定位、inline-block、兼容性需注意的特性总结
inline-block 特性: 1.块在一排显示 2.内联支持宽高 3.默认内容撑开宽度 4.标签之间的换行间隙被解析(问题)[相当字体大小的一半] 5.ie6 ie7不支持块属性标签的inline ...
- ANY数据类型的使用
程序举例: TAR1 #T_AR1 //save addressregister 1 TAR2 #T_AR2 //save addressregister 2 LAR1 P##DST_BLOCK_ ...
- .NET文件跨服务器上传下载
环境说明:两台服务器服务器为A,服务器为B,服务器B为文件服务器 1.在A和B上创建用户docshareuser,用户名和密码保持一致 2.B服务器上设置附件文件夹Attachments共享,添加用户 ...