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

应网友需求,写一个从.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 生成的界面

未生成前目录内容
生成的目录

打开生成的程序
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容