close

一、前言

已經寫好使用者介面了,現在就把它包起來傳給朋友玩玩看!

pyinstaller是打包python很方便的一個套件,我們可以很輕易地使用他。

或者你不知道.spec檔及產生資料夾是什麼,可以直接拉到最下面,不然我們就手把手教到好樓!

 

二、打包

都還不會打包的,可以直接跳過指令大全往下看,會了再回來看唷!

常用pyinstaller參考:

# 說明文件
pyinstaller -h

# 打包成一個執行檔
pyinstaller -F [要打包的.py檔]

# 打包成一個資料夾
pyinstaller -D [要打包的.py檔]

# 加入--hiddenimport手動匯入套件包 安裝完後找不到套件用
pyinstaller -F --hiddenimport [套件包方法] [要打包的.py檔]

# 加入-w執行時不顯示cmd
pyinstaller -F -w [要打包的.py檔]

# 只產生spec檔
pyi-makespec options name.py

 

(1) 安裝pyinstaller(有安裝的可以跳過)

打開cmd並打上pip install pyinstaller

image

 

(2) 使用pyinstaller打包

a. 切到工作目錄

打包前,記得確認程式有沒有錯,套件包都有辦法import進去唷~

輸入cd [你要打包的程式資料夾]

image

b. 打包程式

我們來嘗試打包main.py

輸入pyinstaller -F main.py,規則是pyinstaller -F [你要打包的py檔名稱]

# main.py 如下

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QFrame
import sys

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(454, 177)
        self.pushButton_print = QtWidgets.QPushButton(Form)
        self.pushButton_print.setGeometry(QtCore.QRect(170, 120, 93, 28))
        self.pushButton_print.setObjectName("pushButton_print")
        self.label_print = QtWidgets.QLabel(Form)
        self.label_print.setGeometry(QtCore.QRect(20, 20, 51, 61))
        self.label_print.setObjectName("label_print")
        self.lineEdit_print = QtWidgets.QLineEdit(Form)
        self.lineEdit_print.setGeometry(QtCore.QRect(80, 20, 351, 61))
        self.lineEdit_print.setObjectName("lineEdit_print")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton_print.setText(_translate("Form", "點我開始"))
        self.label_print.setText(_translate("Form", "顯示:"))

class MainFrame(QFrame, Ui_Form):
    def __init__(self, parent=None):
        super(MainFrame, self).__init__(parent) # 調用父類把子類對象轉為父類對象
        # 調用介面
        self.setupUi(self) 
        
        # 信號
        self.pushButton_print.clicked.connect(self.calculation) # 信號與槽連接
        
    # 自訂槽函數
    def calculation(self):
        a = 1
        b = 2
        c = a + b
        d = c * 2
        self.lineEdit_print.setText('恩哥好帥' + str(d)) # .setText方法讓文字顯示在lineEdit上
            

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainFrame = MainFrame()
    mainFrame.show()
    sys.exit(app.exec_())

後面寫成功就是可以樓!

image

成功會出現.spec文件、build資料夾及dist資料夾!,dist裡面放我們打包好的檔案,拿給朋友玩吧!

.spec:紀錄打包參數等等,可以想成安裝預設檔案,也可以用來打包,pyinstaller -F main.spec

build:打包所產生的文件,不用理會

dist:放著我們的執行檔,我習慣拉出來,留下相關文件(要引入的.xlsx .csv等不要刪捏),剩下都刪掉!

2

 

三、後記

如果有打包裡面有牽扯到路徑的,盡量多用os裡的方法唷,因為你不知道其他使用者的路徑關係!

但你可能會發現你的.exe很大,會者執行很慢,這樣表示說,打包時還包了一堆我們用不到的東西,

這時候就要結合虛擬環境去打包,相當簡單5分鐘看完馬上上手

【Python虛擬環境】虛擬環境下打包:conda env+pyinstaller打包你的py檔 防止打包後檔案過大

 

arrow
arrow
    創作者介紹
    創作者 恩哥Python 的頭像
    恩哥Python

    恩哥Python量化教室-零基礎也能學會Python

    恩哥Python 發表在 痞客邦 留言(0) 人氣()