Pyinstaller--Pyqt桌面端实现

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_())

你可能感兴趣的:(Pyinstaller--Pyqt桌面端实现)