中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用pyinstaller打包python PyQt5程序

發布時間:2021-10-08 09:13:15 來源:億速云 閱讀:176 作者:柒染 欄目:開發技術

這期內容當中小編將會給大家帶來有關如何使用pyinstaller打包python PyQt5程序,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

    當你有打包你的python應用的需求以后,你可能會像搜索引擎尋求幫助,你或許曾經搜索過“python 轉 exe”,“python打包”等等這樣的字眼,你或許曾看到過各種各樣的相關解決方案,現在介紹的是其中的一種,但是可以負責任的說,這是目前最好的方案,并且是跨平臺最好的方案,也就是說使用這個叫pyinstaller的工具,你可以把同樣的代碼打包在Windows,Linux以及macOs上運行。

    這個工具的名稱就是pyinstaller,官方主頁:
    http://www.pyinstaller.org/

    這個工具將打包工作封裝成一條簡單的指令就能完成的動作。

    準備

    工具準備

    第一件事情當然是安裝這個庫了,和往常一樣,使用pip

    pip install pyinstaller

    源代碼準備

    因為我們是針對一個GUI應用來打包,那么我們需要簡單的改造一下源代碼,如果你是在打包命令行,則不需要進行這個操作。

    首先,我們要創建一個入口文件,名稱為 wifidrop.pyw,名字無所謂,它將成為你最終的軟件名稱,這里需要注意的是,我們的文件后綴為pyw,比py文件后綴多了一個w,而w的意思是window,也就是說告訴python環境,我們這個軟件是一個窗口應用,如果不這么做,在運行軟件的時候,除了有我們的GUI界面以外,python還會留 一個命令行窗口在后邊,這顯然不是我們想要的,而使用了pyw后綴以后,python則不會顯示命令行窗口。

    在 wifidrop.pyw 不需要做什么太多東西,僅僅是簡單的調用main.py中的main函數就可以了。

    import sys
    from main import main
    
    if __name__ == '__main__':
        excode = main()
        sys.exit(excode)

    打包

    做好代碼相關的準備以后,就可以使用pyinstaller來打包軟件了,過程也非常簡單,一行命令就能解決,在命令行中運行

    pyinstaller --clean -F -w wifidrop.pyw -i Treetog-I-Documents.ico

    參數說明

    –clean :告訴pyinstaller刪除緩存和臨時文件
    -F :告訴pyinstaller將打包的結果放在一個exe文件中,也就是說最終結果將只有一個exe文件,如果不使用這個參數,那么結果會是一個exe加很多依賴文件,不利于我們分發軟件。
    -w :告訴pyinstaller我們要生成的是一個窗口應用
    -i :為我們的應用指定一個圖標,否則默認的話會使用python圖標
    一般來說,這些參數就足夠日常使用了,如果需要更深入的功能,比如加密等等,就需要閱讀手冊了。

    這條命令成功運行完以后,你將會在項目目錄中看到build和dist兩個文件夾,最終的可執行文件就放置在dist文件家中。

    針對PyQt應用的改進

    目前的小問題

    當我們嘗試運行在dist中生成的wifidrop.exe文件的時候,你將發現,程序無法運行,不知道你還有沒有印象,至今為止,我們都一直在main.py中使用loadUi函數加載Qt Creator創建的ui的方式來創建GUI界面,那么仔細觀察一下dist文件夾中,里邊并沒有ui文件,對吧?

    因為pyinstaller僅僅是一個py應用的打包工具,它并不知道其他的文件的存在,所以,你可以嘗試把我們的兩個ui文件拷貝到dist文件夾中之后再運行這個exe。

    如何使用pyinstaller打包python PyQt5程序

    你會發現現在應用可以正常使用了。但是這樣會不會有什么風險?

    對了,ui文件說白了是一個xml格式的文本文件,如果使用我們軟件的人有意或者無意的修改了這兩個文件中的內容,我們的軟件極有可能就沒辦法運行了,因此,在分發我們的軟件的時候,要避免使用ui文件。

    ui文件的好處是在開發的時候,可以迅速的通過Qt Creator修改UI。

    解決辦法

    當然PyQt也提供了很好的解決辦法,它提供了一個小腳本,可以幫我們把ui文件轉成py文件,并將UI轉換成類。我們通過運行下邊這兩條命令,將mainwindow和dialog轉成python類。

    python -m PyQt5.uic.pyuic -x dialog.ui -o dialog.py
    python -m PyQt5.uic.pyuic -x mainwindow.ui -o mainwindow.py

    每一個ui文件會對應一個py文件,而py文件中會有相應的類。

    有了py模塊以后,我們還需要在實例化ui的地方(也就是main.py)中將加載ui文件的方式改為實例化python類的方式來加載ui,分別要修改MainWindow和SendDialog的初始化函數,選擇2 option的方式來加載ui

    class MainWindow(QMainWindow):
        """Main window"""
        def __init__(self):
            super(MainWindow, self).__init__()
    
            # UI setup - 1 option
            # dynamic load ui for development purpose
            # self.ui = loadUi('./mainwindow.ui', self)
    
            # Use py to setup UI - 2 option
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
    
            self.setStatusBar(None)  # https://doc.qt.io/qt-5/qmainwindow.html#setStatusBa
    class SendDialog(QDialog):
        def __init__(self, url_list, socket_server_thread, device_discover_thread, socket_broadcast):
            super(SendDialog, self).__init__()
    
            # UI setup - 1 option
            # dynamic load ui for development purpose
            # self.ui = loadUi('./dialog.ui', self)
    
            # Use py to setup UI - 2 option
            self.ui = Ui_dialog()
            self.ui.setupUi(self)

    再次打包

    代碼修正之后,我們來使用上邊相同的pyinstaller命令打包,成功運行后,點擊生成的wifidrop.exe,你會發現在無需ui文件的情況下,軟件也能很好的運行了。

    代碼倉庫說明

    文中用到的打包命令和ui轉py命令,可以在github 倉庫 https://github.com/pythonlibrary/wifidrop 中的 tutorial-6-direct-dist 和 tutorial-6-dist tag下找到,這兩個tag的區別是:前一個使用了加載ui文件的方式顯示UI,后邊一個修正了這個問題,使用類實例化的方式顯示UI。

    上述就是小編為大家分享的如何使用pyinstaller打包python PyQt5程序了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    苏州市| 措勤县| 桐乡市| 通化县| 波密县| 习水县| 长泰县| 怀宁县| 柞水县| 宁安市| 榆林市| 延吉市| 六安市| 平昌县| 永宁县| 襄垣县| 莱芜市| 盐边县| 西和县| 景东| 台中市| 三门峡市| 江门市| 长沙市| 长垣县| 怀远县| 绍兴市| 运城市| 彭水| 区。| 上高县| 光泽县| 高雄县| 辰溪县| 准格尔旗| 翁牛特旗| 青铜峡市| 南昌市| 车致| 蓬安县| 望都县|