应网友需求,写一个从.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.py
和 main.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)