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写了个小工具 为了提升开发效率,就直接借用了雷子开源的性能测试工具的布局,自己美化了一下,然后加入了实时显示数据的 ...
随机推荐
- Golang里面使用protobuf(proto3)
参考文章:https://developers.google.com/protocol-buffers/docs/gotutorial 1.执行指令: go envgo get github.com/ ...
- 新增了个job
https://112.124.41.113/svn/wbhpro/wbh-adapter-job
- visual studio 调试时遇到 System.BadImageFormatException
System.BadImageFormatException”类型的未经处理的异常在 未知模块. 中发生 其他信息: 未能加载文件或程序集“SendYourIP.exe”或它的某一个依赖项.生成此程序 ...
- mysql数据导出excel格式+乱码解决
1:导出的SQL命令,只需要加上“FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' ” ...
- Deployment failure on Tomcat 6.x. Could not copy all resources to……
http://blog.knowsky.com/194238.htm tomcat部署不成功 Deployment failure on Tomcat 6.x. Could not copy all ...
- JAVA源码走读(一) HashMap与ArrayList
HashMap 一.HashMap基本概念: HashMap是基于哈希表的Map接口的实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒 ...
- Unity关于获取游戏对象
我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我.我看很多人喜欢在类里面去保存GameObject对象.解决G ...
- 改写jquery.validate.unobtrusive.js实现气泡提示mvc错误
个人对于这个js.css不是很擅长,所以这个气泡提醒的样式网上找了下,用了这个http://www.cnblogs.com/wifi/articles/2918950.html当中的第一种写法. 对于 ...
- css属性在各种浏览器上的兼容性
transform:在360急速浏览器不支持,在IE兼容性上看IE浏览器的版本,IE9+是支持.
- tornado 反向代理后 获取真实客户端IP
首先,nginx必定会设置一个Header传送过来真实的IP nginx.conf server { proxy_set_header X-Real-IP $remote_addr; location ...