應(yīng)網(wǎng)友需求,寫一個從.py文件開始,生成界面,然后打包發(fā)布exe程序的教程
第一步 :編寫你的py文件,實現(xiàn)你想要的功能
這里主要是為了演示整個流程,所以就拿一個之前做的爬蟲程序來做演示,可以按照當(dāng)日銷量、兩小時銷量一鍵爬取淘寶上的商品,生成二維碼,保存在本地。具體的程序不是重點,先不說,下次有機(jī)會再聊。
第二步:用QTdesigner生成界面
用Python寫界面--上位機(jī)開發(fā)
看這個教程可以生成你的界面,我把我生成的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", "點擊生成當(dāng)天銷量排行"))
self.pushButton_2.setText(_translate("MainWindow", "點擊生成兩小時銷量排行"))
第三步:調(diào)用界面,生成界面
直接上程序
#!/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_())
第四步:打包發(fā)布EXE程序
4.1 安裝pyinstaller
pip install pyinstaller
4.2 pyinstaller用法
cd到想要打包為exe程序的文件所在目錄,將想要打包的文件全部放入這個目錄,本例中要放入兩個:ui.py和 main.py
pyinstaller [opts] program.py
以下是所以可選的命令
| 命令 | 含義 |
|---|---|
| -F, –onefile | 產(chǎn)生一個文件用于部署 (參見XXXXX). |
| -D, –onedir | 產(chǎn)生一個目錄用于部署 (默認(rèn)) |
| -K, –tk | 在部署時包含 TCL/TK |
| -a, –ascii | 不包含編碼.在支持Unicode的python版本上默認(rèn)包含所有的編碼. |
| -d, –debug | 產(chǎn)生debug版本的可執(zhí)行文件 |
| -w,–windowed,–noconsole | 使用Windows子系統(tǒng)執(zhí)行.當(dāng)程序啟動的時候不會打開命令行(只對Windows有效) |
| -c,–nowindowed,–console | 使用控制臺子系統(tǒng)執(zhí)行(默認(rèn))(只對Windows有效) |
| -s,–strip | 可執(zhí)行文件和共享庫將run through strip.注意Cygwin的strip往往使普通的win32 Dll無法使用. |
| -X, –upx | 如果有UPX安裝(執(zhí)行Configure.py時檢測),會壓縮執(zhí)行文件(Windows系統(tǒng)中的DLL也會)(參見note) |
| -o DIR, –out=DIR | 指定spec文件的生成目錄,如果沒有指定,而且當(dāng)前目錄是PyInstaller的根目錄,會自動創(chuàng)建一個用于輸出(spec和生成的可執(zhí)行文件)的目錄.如果沒有指定,而當(dāng)前目錄不是PyInstaller的根目錄,則會輸出到當(dāng)前的目錄下. |
| -p DIR, –path=DIR | 設(shè)置導(dǎo)入路徑(和使用PYTHONPATH效果相似).可以用路徑分割符(Windows使用分號,Linux使用冒號)分割,指定多個目錄.也可以使用多個-p參數(shù)來設(shè)置多個導(dǎo)入路徑 |
| –icon=<FILE.ICO> | 將file.ico添加為可執(zhí)行文件的資源(只對Windows系統(tǒng)有效) |
| –icon=<FILE.EXE,N> | 將file.exe的第n個圖標(biāo)添加為可執(zhí)行文件的資源(只對Windows系統(tǒng)有效) |
| -v FILE, –version=FILE | 將verfile作為可執(zhí)行文件的版本資源(只對Windows系統(tǒng)有效) |
| -n NAME, –name=NAME | 可選的項目(產(chǎn)生的spec的)名字.如果省略,第一個腳本的主文件名將作為spec的名字 |
4.3 本例中打包
要注意的一點是本文中用到了PyQt5作為界面,因此打包時要添加--paths來指定PyQt5的路徑(ps:你要針對自己的安裝路徑進(jìn)行修改):
--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到指定目錄后,執(zhí)行以下命令:
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
是不是感覺太長了,那么我們寫一個文件,讓他自動執(zhí)行,如下所示:
#!/usr/bin/env python3
# -\- coding: utf-8 -\-
from PyInstaller.__main__ import run
# -F:打包成一個EXE文件
# -w:不帶console輸出控制臺,window窗體格式
# --paths:依賴包路徑
# --icon:圖標(biāo)
# --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 生成的界面

未生成前目錄內(nèi)容

生成的目錄

打開生成的程序