美文网首页python自学
从.py到.exe的完全手册(包含PyQt5界面)

从.py到.exe的完全手册(包含PyQt5界面)

作者: IConquer | 来源:发表于2018-06-08 20:33 被阅读20次

    应网友需求,写一个从.py文件开始,生成界面,然后打包发布exe程序的教程

    第一步 :编写你的py文件,实现你想要的功能

    这里主要是为了演示整个流程,所以就拿一个之前做的爬虫程序来做演示,可以按照当日销量、两小时销量一键爬取淘宝上的商品,生成二维码,保存在本地。具体的程序不是重点,先不说,下次有机会再聊。

    第二步:用QTdesigner生成界面

    用Python写界面--上位机开发
    看这个教程可以生成你的界面,我把我生成的gui.py文件贴到下面,你们可以直接拿过去用

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'ui.ui'
    #
    # Created by: PyQt5 UI code generator 5.10.1
    #
    # WARNING! All changes made in this file will be lost!
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(759, 436)
            MainWindow.setToolTip("")
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.pushButton = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(110, 100, 521, 71))
            self.pushButton.setObjectName("pushButton")
            self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
            self.pushButton_2.setGeometry(QtCore.QRect(110, 240, 521, 71))
            self.pushButton_2.setObjectName("pushButton_2")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 759, 26))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "自动生成淘宝二维码图片"))
            MainWindow.setStatusTip(_translate("MainWindow", "Writen by Li-Bo"))
            self.pushButton.setText(_translate("MainWindow", "点击生成当天销量排行"))
            self.pushButton_2.setText(_translate("MainWindow", "点击生成两小时销量排行"))
    

    第三步:调用界面,生成界面

    直接上程序

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # Author —— 李博
    import sys
    from PyQt5.QtWidgets import QApplication,QMainWindow
    import time
    import logging
    
    import ui
    
    Ui_MainWindow = ui.Ui_MainWindow
    
    class MyApp(QMainWindow, Ui_MainWindow):
    
        def __init__(self):
            super().__init__()
            QMainWindow.__init__(self)
            Ui_MainWindow.__init__(self)
            self.setupUi(self)
            self.createButtons()
            
        def get_top_day_goods(self):
            with open("top_day.txt", "w") as f:
                for index in range(100):
                    f.write(str(index)+ "\n")
    
        def get_top_hour_goods(self):
            with open("top_hours.txt", "w") as f:
                for index2 in range(100):
                    f.write(str(index2) + "\n")
                    
        def createButtons(self):
            self.pushButton.clicked.connect(self.get_top_day_goods)
            self.pushButton_2.clicked.connect(self.get_top_hour_goods)
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = MyApp()
        window.show()
        sys.exit(app.exec_())
    
    

    第四步:打包发布EXE程序

    4.1 安装pyinstaller

    pip install pyinstaller
    

    4.2 pyinstaller用法

    cd到想要打包为exe程序的文件所在目录,将想要打包的文件全部放入这个目录,本例中要放入两个:ui.pymain.py

    pyinstaller [opts] program.py
    

    以下是所以可选的命令

    命令 含义
    -F, –onefile 产生一个文件用于部署 (参见XXXXX).
    -D, –onedir 产生一个目录用于部署 (默认)
    -K, –tk 在部署时包含 TCL/TK
    -a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
    -d, –debug 产生debug版本的可执行文件
    -w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
    -c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)
    -s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.
    -X, –upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)
    -o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
    -p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径
    –icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对Windows系统有效)
    –icon=<FILE.EXE,N> 将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)
    -v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)
    -n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字

    4.3 本例中打包

    要注意的一点是本文中用到了PyQt5作为界面,因此打包时要添加--paths来指定PyQt5的路径(ps:你要针对自己的安装路径进行修改):

    --paths=C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\bin
    --paths=C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\plugins
    

    因此,cd到指定目录后,执行以下命令:

    pyinstaller -F -w --paths=C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\bin --paths=C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\plugins  main.py
    

    是不是感觉太长了,那么我们写一个文件,让他自动执行,如下所示:

    #!/usr/bin/env python3
    # -\- coding: utf-8 -\-
    from PyInstaller.__main__ import run
    # -F:打包成一个EXE文件 
    # -w:不带console输出控制台,window窗体格式 
    # --paths:依赖包路径 
    # --icon:图标 
    # --noupx:不用upx压缩 
    # --clean:清理掉临时文件
    
    if __name__ == '__main__':
        opts = ['-F', '-w', '--paths=C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\bin',
                '--paths=C:\Users\Lenovo\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyQt5\Qt\plugins',
                '--noupx', '--clean',
                'main.py']
        run(opts)
    

    4.4 生成的界面

    未生成前目录内容 生成的目录
    打开生成的程序

    相关文章

      网友评论

        本文标题:从.py到.exe的完全手册(包含PyQt5界面)

        本文链接:https://www.haomeiwen.com/subject/egpasftx.html