Pyinstaller:py文件打包EXE工具
桌面端的简单实现
功能:
1.单文件打包
2.可设置图标
3.一次只能打包一个py文件
4.无窗口模式
import subprocess
si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
si.wShowWindow = subprocess.SW_HIDE
def check_pyinstaller():
"""
检查pyinstaller是否存在
:return:
"""
cmd = "pyinstaller --version && exit"
s = subprocess.Popen(cmd, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True, startupinfo=si, shell=True)
res = s.stdout.read()
if "不是内部或外部命令,也不是可运行的程序" or "未找到命令" not in res:
version = res
return True
else:
return False
def pack(pypath="", icopath=None):
"""
程序打包
:param pypath: py文件路径
:param icopath: 图标文件路径
:return:
"""
if not check_pyinstaller():
return False
if pypath:
if icopath:
cmd = "pyinstaller -F -i {} {} -w && exit".format(icopath, pypath)
else:
cmd = "pyinstaller -F {} -w && exit".format(pypath)
s = subprocess.Popen(cmd, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True, startupinfo=si, shell=True)
res = s.stdout.read()
return res
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QFormLayout, QLineEdit, QLabel, QPushButton, QTextEdit, QFileDialog, \
QMessageBox, QDesktopWidget
class Winform(QWidget):
def __init__(self, parent=None):
super(Winform, self).__init__(parent)
self.init_UI()
def init_UI(self):
"""
界面设置
:return:
"""
self.setWindowTitle("Pyinstaller打包工具")
self.resize(600, 300)
self.setFixedSize(self.width(), self.height())
self.formLayout = QFormLayout()
self.lab1 = QLabel("PY文件路径")
self.lineEdit1 = QLineEdit('')
self.lineEdit1.setReadOnly(True)
self.lineEdit1.setMinimumWidth(480)
self.pbt1 = QPushButton('选择文件')
self.pbt1.setObjectName('py')
self.pbt1.clicked.connect(self.get_file)
self.lab2 = QLabel("图标文件路径")
self.lineEdit2 = QLineEdit('')
self.lineEdit2.setReadOnly(True)
self.lineEdit2.setMinimumWidth(480)
self.pbt2 = QPushButton('选择文件(可选)')
self.pbt2.setObjectName('ico')
self.pbt2.clicked.connect(self.get_file)
self.lab3 = QLabel("输出结果")
self.pbt3 = QPushButton('开始打包')
self.pbt3.setObjectName('package')
self.pbt3.clicked.connect(self.get_file)
self.txtedit = QTextEdit()
self.txtedit.setReadOnly(True)
# 向布局中添加这几个控件
self.formLayout.addRow(self.lab1)
self.formLayout.addRow(self.lineEdit1, self.pbt1)
self.formLayout.addRow(self.lab2)
self.formLayout.addRow(self.lineEdit2, self.pbt2)
self.formLayout.addRow(self.lab3, self.pbt3)
self.formLayout.addRow(self.txtedit)
self.setLayout(self.formLayout)
def center(self):
# 窗口居中方法
# 获得窗口
qr = self.frameGeometry()
# 获得屏幕中心点
cp = QDesktopWidget().availableGeometry().center()
# 显示到屏幕中心
qr.moveCenter(cp)
self.move(qr.topLeft())
def mesbox(self, mes):
msgBox = QMessageBox()
msgBox.setWindowTitle(u'提示')
msgBox.setText(u"{}".format(mes))
msgBox.addButton(QMessageBox.Ok)
msgBox.button(QMessageBox.Ok).hide()
msgBox.exec_()
def get_file(self):
"""
打开文件浏览器,并获得路径,及输出结果
:return:
"""
button = self.sender()
button_name = button.objectName()
if button_name == "py":
filename, _ = QFileDialog.getOpenFileName(None, 'open', r".", ' ')
self.lineEdit1.setText(filename)
elif button_name == "ico":
filename, _ = QFileDialog.getOpenFileName(None, 'open', r".", ' ')
self.lineEdit2.setText(filename)
elif button_name == "package":
line1_text = self.lineEdit1.text()
line2_text = self.lineEdit2.text()
if line1_text and line2_text:
res = pack(pypath=line1_text, icopath=line2_text)
if res:
if "completed successfully" not in res:
self.mesbox(mes="package fail")
else:
self.txtedit.setText(res)
self.mesbox(mes="completed successfully")
else:
self.txtedit.setText("package fail")
self.mesbox(mes="package fail")
elif line1_text:
res = pack(pypath=line1_text)
if res:
if "completed successfully" not in res:
self.mesbox(mes="package fail")
else:
self.txtedit.setText(res)
self.mesbox(mes="completed successfully")
else:
self.txtedit.setText("package fail")
else:
return False
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Winform()
form.show()
sys.exit(app.exec_())










网友评论