最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用pyinstaller打包python PyQt5程序

 更新時(shí)間:2021年10月06日 14:29:55   投稿:wdc  
當(dāng)你寫(xiě)好一個(gè)python應(yīng)用以后(有可能是命令行,有可能是GUI),你或許希望分享給他人使用,而別人可能并沒(méi)有python環(huán)境,那么我們需要尋找一種方法生成可執(zhí)行文件(比如Windows上的exe或macOs上的app)

當(dāng)你有打包你的python應(yīng)用的需求以后,你可能會(huì)像搜索引擎尋求幫助,你或許曾經(jīng)搜索過(guò)“python 轉(zhuǎn) exe”,“python打包”等等這樣的字眼,你或許曾看到過(guò)各種各樣的相關(guān)解決方案,本文介紹的是其中的一種,但是可以負(fù)責(zé)任的說(shuō),這是目前最好的方案,并且是跨平臺(tái)最好的方案,也就是說(shuō)使用這個(gè)叫pyinstaller的工具,你可以把同樣的代碼打包在Windows,Linux以及macOs上運(yùn)行。

這個(gè)工具的名稱(chēng)就是pyinstaller,官方主頁(yè):
http://www.pyinstaller.org/

這個(gè)工具將打包工作封裝成一條簡(jiǎn)單的指令就能完成的動(dòng)作。

準(zhǔn)備

工具準(zhǔn)備

第一件事情當(dāng)然是安裝這個(gè)庫(kù)了,和往常一樣,使用pip

pip install pyinstaller

源代碼準(zhǔn)備

因?yàn)槲覀兪轻槍?duì)一個(gè)GUI應(yīng)用來(lái)打包,那么我們需要簡(jiǎn)單的改造一下源代碼,如果你是在打包命令行,則不需要進(jìn)行這個(gè)操作。

首先,我們要?jiǎng)?chuàng)建一個(gè)入口文件,名稱(chēng)為 wifidrop.pyw,名字無(wú)所謂,它將成為你最終的軟件名稱(chēng),這里需要注意的是,我們的文件后綴為pyw,比py文件后綴多了一個(gè)w,而w的意思是window,也就是說(shuō)告訴python環(huán)境,我們這個(gè)軟件是一個(gè)窗口應(yīng)用,如果不這么做,在運(yùn)行軟件的時(shí)候,除了有我們的GUI界面以外,python還會(huì)留 一個(gè)命令行窗口在后邊,這顯然不是我們想要的,而使用了pyw后綴以后,python則不會(huì)顯示命令行窗口。

在 wifidrop.pyw 不需要做什么太多東西,僅僅是簡(jiǎn)單的調(diào)用main.py中的main函數(shù)就可以了。

import sys
from main import main

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

打包

做好代碼相關(guān)的準(zhǔn)備以后,就可以使用pyinstaller來(lái)打包軟件了,過(guò)程也非常簡(jiǎn)單,一行命令就能解決,在命令行中運(yùn)行

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

參數(shù)說(shuō)明

–clean :告訴pyinstaller刪除緩存和臨時(shí)文件
-F :告訴pyinstaller將打包的結(jié)果放在一個(gè)exe文件中,也就是說(shuō)最終結(jié)果將只有一個(gè)exe文件,如果不使用這個(gè)參數(shù),那么結(jié)果會(huì)是一個(gè)exe加很多依賴(lài)文件,不利于我們分發(fā)軟件。
-w :告訴pyinstaller我們要生成的是一個(gè)窗口應(yīng)用
-i :為我們的應(yīng)用指定一個(gè)圖標(biāo),否則默認(rèn)的話會(huì)使用python圖標(biāo)
一般來(lái)說(shuō),這些參數(shù)就足夠日常使用了,如果需要更深入的功能,比如加密等等,就需要閱讀手冊(cè)了。

這條命令成功運(yùn)行完以后,你將會(huì)在項(xiàng)目目錄中看到build和dist兩個(gè)文件夾,最終的可執(zhí)行文件就放置在dist文件家中。

針對(duì)PyQt應(yīng)用的改進(jìn)

目前的小問(wèn)題

當(dāng)我們嘗試運(yùn)行在dist中生成的wifidrop.exe文件的時(shí)候,你將發(fā)現(xiàn),程序無(wú)法運(yùn)行,不知道你還有沒(méi)有印象,至今為止,我們都一直在main.py中使用loadUi函數(shù)加載Qt Creator創(chuàng)建的ui的方式來(lái)創(chuàng)建GUI界面,那么仔細(xì)觀察一下dist文件夾中,里邊并沒(méi)有ui文件,對(duì)吧?

因?yàn)閜yinstaller僅僅是一個(gè)py應(yīng)用的打包工具,它并不知道其他的文件的存在,所以,你可以嘗試把我們的兩個(gè)ui文件拷貝到dist文件夾中之后再運(yùn)行這個(gè)exe。

你會(huì)發(fā)現(xiàn)現(xiàn)在應(yīng)用可以正常使用了。但是這樣會(huì)不會(huì)有什么風(fēng)險(xiǎn)?

對(duì)了,ui文件說(shuō)白了是一個(gè)xml格式的文本文件,如果使用我們軟件的人有意或者無(wú)意的修改了這兩個(gè)文件中的內(nèi)容,我們的軟件極有可能就沒(méi)辦法運(yùn)行了,因此,在分發(fā)我們的軟件的時(shí)候,要避免使用ui文件。

ui文件的好處是在開(kāi)發(fā)的時(shí)候,可以迅速的通過(guò)Qt Creator修改UI。

解決辦法

當(dāng)然PyQt也提供了很好的解決辦法,它提供了一個(gè)小腳本,可以幫我們把ui文件轉(zhuǎn)成py文件,并將UI轉(zhuǎn)換成類(lèi)。我們通過(guò)運(yùn)行下邊這兩條命令,將mainwindow和dialog轉(zhuǎn)成python類(lèi)。

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

每一個(gè)ui文件會(huì)對(duì)應(yīng)一個(gè)py文件,而py文件中會(huì)有相應(yīng)的類(lèi)。

有了py模塊以后,我們還需要在實(shí)例化ui的地方(也就是main.py)中將加載ui文件的方式改為實(shí)例化python類(lèi)的方式來(lái)加載ui,分別要修改MainWindow和SendDialog的初始化函數(shù),選擇2 option的方式來(lái)加載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)

再次打包

代碼修正之后,我們來(lái)使用上邊相同的pyinstaller命令打包,成功運(yùn)行后,點(diǎn)擊生成的wifidrop.exe,你會(huì)發(fā)現(xiàn)在無(wú)需ui文件的情況下,軟件也能很好的運(yùn)行了。

代碼倉(cāng)庫(kù)說(shuō)明

本文中用到的打包命令和ui轉(zhuǎn)py命令,可以在github 倉(cāng)庫(kù) https://github.com/pythonlibrary/wifidrop 中的 tutorial-6-direct-dist 和 tutorial-6-dist tag下找到,這兩個(gè)tag的區(qū)別是:前一個(gè)使用了加載ui文件的方式顯示UI,后邊一個(gè)修正了這個(gè)問(wèn)題,使用類(lèi)實(shí)例化的方式顯示UI。

更多關(guān)于使用pyinstaller打包python程序的文章請(qǐng)查看下面的相關(guān)文章

相關(guān)文章

  • 關(guān)于python pyqt5安裝失敗問(wèn)題的解決方法

    關(guān)于python pyqt5安裝失敗問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于python pyqt5安裝失敗問(wèn)題的解決方法,文中給出了詳細(xì)的解決過(guò)程與解決方法,對(duì)同樣遇到這個(gè)問(wèn)題的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Python打印異常信息的方法示例詳解

    Python打印異常信息的方法示例詳解

    在 Python 編程中,異常是指程序執(zhí)行過(guò)程中出現(xiàn)的錯(cuò)誤或異常情況,當(dāng)程序遇到異常時(shí),為了更好地調(diào)試和定位問(wèn)題,我們需要打印異常信息,本文將詳細(xì)介紹如何在 Python 中打印異常,并提供一些示例和注意事項(xiàng),需要的朋友可以參考下
    2023-12-12
  • python?pip安裝庫(kù)下載源更換(清華源、阿里源、中科大源、豆瓣源)

    python?pip安裝庫(kù)下載源更換(清華源、阿里源、中科大源、豆瓣源)

    為了提高Python包的下載速度和穩(wěn)定性,可以配置國(guó)內(nèi)的鏡像源,如清華源、阿里源、中科大源和豆瓣源,設(shè)置方法簡(jiǎn)單,只需更改pip的配置文件或使用命令行即可,需要的朋友可以參考下
    2024-10-10
  • Python 中類(lèi)的構(gòu)造方法 __New__的妙用

    Python 中類(lèi)的構(gòu)造方法 __New__的妙用

    這篇文章主要介紹了Python 中類(lèi)的構(gòu)造方法 New的妙用,Python 的類(lèi)中,所有以雙下劃線__包起來(lái)的方法,叫魔術(shù)方法,魔術(shù)方法在類(lèi)或?qū)ο蟮哪承┦录l(fā)出后可以自動(dòng)執(zhí)行,讓類(lèi)具有神奇的魔力。下面就來(lái)學(xué)習(xí)文章的詳細(xì)內(nèi)容把
    2021-10-10
  • Django1.11配合uni-app發(fā)起微信支付的實(shí)現(xiàn)

    Django1.11配合uni-app發(fā)起微信支付的實(shí)現(xiàn)

    這篇文章主要介紹了Django1.11配合uni-app發(fā)起微信支付的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 基于Python編寫(xiě)簡(jiǎn)易文字語(yǔ)音轉(zhuǎn)換器

    基于Python編寫(xiě)簡(jiǎn)易文字語(yǔ)音轉(zhuǎn)換器

    這篇文章主要為大家介紹了如何利用Python編寫(xiě)一個(gè)簡(jiǎn)易文字語(yǔ)音轉(zhuǎn)換器,并打包成exe。文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起嘗試一下
    2022-03-03
  • Python解析微信dat文件的方法

    Python解析微信dat文件的方法

    這篇文章主要介紹了Python解析微信dat文件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python采集王者最低戰(zhàn)力信息實(shí)戰(zhàn)示例

    Python采集王者最低戰(zhàn)力信息實(shí)戰(zhàn)示例

    這篇文章主要為大家介紹了Python采集王者最低戰(zhàn)力信息實(shí)戰(zhàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • python 讀寫(xiě)文件包含多種編碼格式的解決方式

    python 讀寫(xiě)文件包含多種編碼格式的解決方式

    今天小編就為大家分享一篇python 讀寫(xiě)文件包含多種編碼格式的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python爬蟲(chóng)獲取圖片并下載保存至本地的實(shí)例

    Python爬蟲(chóng)獲取圖片并下載保存至本地的實(shí)例

    今天小編就為大家分享一篇Python爬蟲(chóng)獲取圖片并下載保存至本地的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論

宣威市| 名山县| 竹山县| 阳山县| 娄底市| 康马县| 三台县| 北海市| 枣庄市| 黄骅市| 囊谦县| 彝良县| 扬中市| 泽库县| 平陆县| 金华市| 岳西县| 尤溪县| 沙河市| 大新县| 海淀区| 安宁市| 马鞍山市| 上饶县| 玉树县| 繁昌县| 华蓥市| 沈阳市| 乡城县| 道真| 上栗县| 若尔盖县| 乌拉特中旗| 邢台市| 杨浦区| 淮滨县| 凤冈县| 新平| 莲花县| 万盛区| 孟村|