Python pyinstaller實現(xiàn)圖形化打包工具
1.簡介
一個使用Python PYQT5制作的關(guān)于pyinstaller打包工具,代替?zhèn)鹘y(tǒng)的cmd黑窗口模式打包頁面,實現(xiàn)更快捷方便的python打包體驗。資源已打包,大家可自行下載。
相關(guān)功能:
- 識別是否安裝了pyinstaller,如果沒有的話,打開在左上角會提示,并在右上角增加“安裝”按鈕。
- 打包過程設(shè)置為隱式。并且加入“顯示處理”選項。
- 支持一鍵拖拽文件以及自動選擇文件。
- 支持導(dǎo)出到桌面以及設(shè)置打包好的軟件圖標(biāo)。
pyinstaller 相關(guān)參數(shù):
-F 制作獨立的可執(zhí)行程序
-D 制作出的檔案存放在同一個文件夾下(默認(rèn)值)
-K 包含TCL/TK(對于使用了TK的,最好加上這個選項,否則在未安裝TK的電腦上無法運行)
-w 制作窗口程序
-c 制作命令行程序(默認(rèn))
-X 制作使用UPX壓縮過的可執(zhí)行程序(推薦使用這個選項,需要下載UPX包,解壓后upx.exe放在Python(非PyInstaller)安裝目錄下,下載upx308w.zip)
-o DIR 指定輸出SPEC文件路徑(這也決定了最后輸出的exe文件路徑)
–icon=[ICO文件路徑] 指定程序圖標(biāo)
-v [指定文件] 指定程序版本信息
-n [指定程序名] 指定程序名稱
–distpath=D:/dist 輸出到指定位置
2.運行效果
3.相關(guān)源碼
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QTextEdit, QCheckBox, QLabel, QFileDialog from PyQt5.QtGui import QIcon import sys import os import subprocess class WinDow(QWidget): def __init__(self): super().__init__() self.setWindowTitle("Pyinstaller圖形化打包工具") self.setMinimumSize(500 , 300) self.setMaximumSize(500 , 300) self.setWindowIcon(QIcon("pussy.ico")) self.wenjian_ui() self.ico_ui() self.anniu_ui() self.qingchu_ui() self.zhuomian_ui() self.tishi_ui() self.banben_ui() self.anzhuang_ui() self.anzhuang_anniu() self.xianshi_anniu() self.tishi2_ui() self.minglingchuang_ui() self.tishi3_ui() self.wenjian_anniu() self.ico_anniu() self.sczdwz_ui() self.sczdwz_xx() self.baocun_anniu() self.sczdwz_tishi() def wenjian_ui(self): wenjian = QTextEdit(self) self.wenjian = wenjian wenjian.resize(480-50-20 , 150-50-50) wenjian.move(10,30) wenjian.setPlaceholderText("可拖拽py文件至此:") wenjian.setTabChangesFocus(True) def ico_ui(self): ico = QTextEdit(self) self.ico = ico ico.resize(480-50-20 , 50) ico.move(10,190-50-50) ico.setPlaceholderText("可拖拽ico文件至此:") ico.setTabChangesFocus(True) def anniu_ui(self): anniu = QPushButton(self) self.anniu = anniu anniu.setText("打包生成EXE") anniu.move(415 , 340-105) anniu.resize(80,60) self.anniu.clicked.connect(self.anniu_cao) def qingchu_ui(self): qingchu = QPushButton(self) self.qingchu = qingchu qingchu.setText("清空") qingchu.move(415 , 340-105-40) self.qingchu.clicked.connect(self.qingchu_cao) def zhuomian_ui(self): zhuomian = QCheckBox(self) self.zhuomian = zhuomian zhuomian.setText("輸出到桌面") zhuomian.move(20, 345-110-40) # zhuomian.toggled.connect(lambda isChecked :print(isChecked)) def guanbibaocun(): if self.zhuomian.isChecked() == True: self.sczdwzan.setChecked(False) self.sczdwz.setText("") self.baocunanniu.close() elif self.zhuomian.isChecked() == False and self.baocunanniu.isChecked() ==True: self.baocunanniu.show() zhuomian.clicked.connect(guanbibaocun) def tishi_ui(self): tishi = QLabel(self) self.tishi = tishi tishi.setText("支持XP,Win7,Win10等打包到桌面") tishi.setStyleSheet('background-color: rgb(255, 251, 100)') tishi.move(5, 365-113-40) def banben_ui(self): banben = QLabel(self) self.banben = banben banben.move(10, 10) cmd = 'pyinstaller -v' pivi = subprocess.call(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # print(pivi) self.bbpi = pivi if self.bbpi == 0: banben.setText("您已安裝PyInstaller") else: banben.setText("您目前還沒安裝PyInstaller") banben.setStyleSheet('color:rgb(255, 10, 10)') def anzhuang_ui(self): anzhuang = QLabel(self) self.anzhuang = anzhuang anzhuang.move(300,10) if self.bbpi == 0: anzhuang.setText("") else: anzhuang.setText("我要安裝PyInstaller") def anzhuang_anniu(self): azan = QPushButton(self) self.azan = azan azan.move(415,3) if self.bbpi == 0: azan.close() else: azan.setText("我要安裝") azan.clicked.connect(self.anzhuang_cao) def anzhuang_cao(self): a = "pip install pyinstaller" os.system(a) def xianshi_anniu(self): xianshi = QCheckBox(self) self.xianshi = xianshi xianshi.setText("使用顯式處理") xianshi.move(20, 265-40) def tishi2_ui(self): tishi2 = QLabel(self) self.tishi2 = tishi2 tishi2.setText("默認(rèn)使用隱式,顯式處理為彈出打包的命令行界面") tishi2.setStyleSheet('background-color: rgb(255, 251, 100)') tishi2.move(5, 280-40) def minglingchuang_ui(self): minglingchuang = QCheckBox(self) self.minglingchuang = minglingchuang minglingchuang.setText("使用命令窗") minglingchuang.move(20, 255) def tishi3_ui(self): tishi3 = QLabel(self) self.tishi3 = tishi3 tishi3.setText("注意:命令行程序請勾選此選項,否則運行時會提示以下報錯\n failed to execute scipt XXX") tishi3.setStyleSheet('background-color: rgb(255, 251, 100)') tishi3.move(5, 280-10) def wenjian_anniu(self): wenjiananniu = QPushButton(self) self.wenjiananniu = wenjiananniu wenjiananniu.setText("選擇py文件") wenjiananniu.move(430-10, 30+10) # wenjiananniu.resize(30,30) wenjiananniu.adjustSize() wenjiananniu.clicked.connect(self.dakaiwenjian_cao) def dakaiwenjian_cao(self): # dakaiwenjian = QFileDialog.getOpenFileUrl(self) dakaiwenjian = QFileDialog.getOpenFileName(self, "請選擇一個PY文件", "./", "python文件(*.py)", "python文件(*.py)") # print(dakaiwenjian) self.wenjian.setText("file:///"+str(dakaiwenjian[0])) def ico_anniu(self): icoanniu = QPushButton(self) self.icoanniu = icoanniu icoanniu.setText("選擇ico文件") icoanniu.move(430 - 10, 30 + 10+50+10) # wenjiananniu.resize(30,30) icoanniu.adjustSize() icoanniu.clicked.connect(self.dakaiico_cao) def dakaiico_cao(self): # dakaiwenjian = QFileDialog.getOpenFileUrl(self) dakaiico = QFileDialog.getOpenFileName(self, "請選擇一個ico文件", "./", "ico文件(*.ico)", "ico文件(*.ico)") # print(dakaiico) self.ico.setText("file:///"+str(dakaiico[0])) def sczdwz_ui(self): sczdwz = QTextEdit(self) self.sczdwz = sczdwz sczdwz.setText("") sczdwz.move(10 , 170) sczdwz.resize(480-50-20 , 150-50-50-25) sczdwz.setReadOnly(True) def sczdwz_xx(self): sczdwzan = QCheckBox(self) self.sczdwzan = sczdwzan sczdwzan.setText("打包文件輸出到指定位置") sczdwzan.move(20, 345-110-60-25-10) def guanbizhuomian(): if sczdwzan.isChecked() == True: self.zhuomian.setChecked(False) self.baocunanniu.show() else: self.baocunanniu.close() self.sczdwz.setText("") sczdwzan.clicked.connect(guanbizhuomian) def baocun_anniu(self): baocunanniu = QPushButton(self) self.baocunanniu = baocunanniu baocunanniu.setText("選擇保存路徑") baocunanniu.move(480-50-10 , 345-110-60-5) # wenjiananniu.resize(30,30) baocunanniu.adjustSize() baocunanniu.clicked.connect(self.baocunlujin_cao) baocunanniu.close() def sczdwz_tishi(self): sczdwzts = QLabel(self) self.sczdwzts = sczdwzts sczdwzts.setText("打鉤后才會顯示選擇按鈕") sczdwzts.move(5, 345-110-60-20) sczdwzts.setStyleSheet('background-color: rgb(255, 251, 100)') def baocunlujin_cao(self): baocunlujin = QFileDialog.getExistingDirectory(self) # print(baocunlujin) self.sczdwz.setText(baocunlujin) def anniu_cao(self): if self.minglingchuang.isChecked() == True: if self.xianshi.isChecked() == True: if self.zhuomian.isChecked() == True and self.ico.toPlainText() == "": i = "pyinstaller -F " j = self.wenjian.toPlainText() h = " --distpath=%UserProfile%/Desktop/dist" self.k = i + j[8:] + h shuchu = self.k # print(shuchu) os.system(shuchu) elif self.zhuomian.isChecked() == False and self.sczdwzan.isChecked() == False and self.ico.toPlainText() == "": i = "pyinstaller -F " j = self.wenjian.toPlainText() self.k = i + j[8:] shuchu = self.k # print(shuchu) os.system(shuchu) elif self.zhuomian.isChecked() == True and self.ico.toPlainText() != "": i = "pyinstaller -F -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() m = " --distpath=%UserProfile%/Desktop/dist" self.k = i + h[8:] + " " + j[8:] + m shuchu = self.k os.system(shuchu) # print(shuchu) elif self.zhuomian.isChecked() == False and self.sczdwzan.isChecked() == False and self.ico.toPlainText() != "": i = "pyinstaller -F -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() self.k = i + h[8:] + " " + j[8:] shuchu = self.k os.system(shuchu) # print(shuchu) #這是一段 elif self.sczdwzan.isChecked() == True and self.ico.toPlainText() == "": i = "pyinstaller -F " j = self.wenjian.toPlainText() h = " --distpath=" s = self.sczdwz.toPlainText() self.k = i + j[8:] + h + s shuchu = self.k # print(shuchu) os.system(shuchu) elif self.sczdwzan.isChecked() == True and self.ico.toPlainText() != "": i = "pyinstaller -F -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() m = " --distpath=" s = self.sczdwz.toPlainText() self.k = i + h[8:] + " " + j[8:] + m + s shuchu = self.k os.system(shuchu) # print(shuchu) else: pass else: if self.zhuomian.isChecked() == True and self.ico.toPlainText() == "": i = "pyinstaller -F " j = self.wenjian.toPlainText() h = " --distpath=%UserProfile%/Desktop/dist" self.k = i + j[8:] + h shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.zhuomian.isChecked() == False and self.sczdwzan.isChecked() == False and self.ico.toPlainText() == "": i = "pyinstaller -F " j = self.wenjian.toPlainText() self.k = i + j[8:] shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.zhuomian.isChecked() == True and self.ico.toPlainText() != "": i = "pyinstaller -F -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() m = " --distpath=%UserProfile%/Desktop/dist" self.k = i + h[8:] + " " + j[8:] + m shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.zhuomian.isChecked() == False and self.sczdwzan.isChecked() == False and self.ico.toPlainText() != "": i = "pyinstaller -F -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() self.k = i + h[8:] + " " + j[8:] shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) #這是第二段 elif self.sczdwzan.isChecked() == True and self.ico.toPlainText() == "": i = "pyinstaller -F " j = self.wenjian.toPlainText() h = " --distpath=" s = self.sczdwz.toPlainText() self.k = i + j[8:] + h + s shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.sczdwzan.isChecked() == True and self.ico.toPlainText() != "": i = "pyinstaller -F -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() m = " --distpath=" s = self.sczdwz.toPlainText() self.k = i + h[8:] + " " + j[8:] + m + s shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) else: pass else: if self.xianshi.isChecked() == True: if self.zhuomian.isChecked() == True and self.ico.toPlainText() == "": i = "pyinstaller -F -w " j = self.wenjian.toPlainText() h = " --distpath=%UserProfile%/Desktop/dist" self.k = i + j[8:] + h shuchu = self.k # print(shuchu) os.system(shuchu) elif self.zhuomian.isChecked() == False and self.sczdwzan.isChecked() == False and self.ico.toPlainText() == "": i = "pyinstaller -F -w " j = self.wenjian.toPlainText() self.k = i + j[8:] shuchu = self.k # print(shuchu) os.system(shuchu) elif self.zhuomian.isChecked() == True and self.ico.toPlainText() != "": i = "pyinstaller -F -w -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() m = " --distpath=%UserProfile%/Desktop/dist" self.k = i + h[8:] + " " + j[8:] + m shuchu = self.k os.system(shuchu) # print(shuchu) elif self.zhuomian.isChecked() == False and self.sczdwzan.isChecked() == False and self.ico.toPlainText() != "": i = "pyinstaller -F -w -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() self.k = i + h[8:] + " " + j[8:] shuchu = self.k os.system(shuchu) # print(shuchu) elif self.sczdwzan.isChecked() == True and self.ico.toPlainText() == "": i = "pyinstaller -F -w " j = self.wenjian.toPlainText() h = " --distpath=" s = self.sczdwz.toPlainText() self.k = i + j[8:] + h + s shuchu = self.k # print(shuchu) os.system(shuchu) elif self.sczdwzan.isChecked() == True and self.ico.toPlainText() != "": i = "pyinstaller -F -w -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() m = " --distpath=" s = self.sczdwz.toPlainText() self.k = i + h[8:] + " " + j[8:] + m + s shuchu = self.k os.system(shuchu) # print(shuchu) else: pass else: if self.zhuomian.isChecked() == True and self.ico.toPlainText() == "": i = "pyinstaller -F -w " j = self.wenjian.toPlainText() h = " --distpath=%UserProfile%/Desktop/dist" self.k = i + j[8:] + h shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.zhuomian.isChecked() == False and self.sczdwzan.isChecked() == False and self.ico.toPlainText() == "": i = "pyinstaller -F -w " j = self.wenjian.toPlainText() self.k = i + j[8:] shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.zhuomian.isChecked() == True and self.ico.toPlainText() != "": i = "pyinstaller -F -w -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() m = " --distpath=%UserProfile%/Desktop/dist" self.k = i + h[8:] + " " + j[8:] + m shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.zhuomian.isChecked() == False and self.sczdwzan.isChecked() == False and self.ico.toPlainText() != "": i = "pyinstaller -F -w -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() self.k = i + h[8:] + " " + j[8:] shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.sczdwzan.isChecked() == True and self.ico.toPlainText() == "": i = "pyinstaller -F -w " j = self.wenjian.toPlainText() h = " --distpath=" s = self.sczdwz.toPlainText() self.k = i + j[8:] + h + s shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) elif self.sczdwzan.isChecked() == True and self.ico.toPlainText() != "": i = "pyinstaller -F -w -i " j = self.wenjian.toPlainText() h = self.ico.toPlainText() m = " --distpath=" s = self.sczdwz.toPlainText() self.k = i + h[8:] + " " + j[8:] + m + s shuchu = self.k # print(shuchu) subprocess.call(shuchu, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) else: pass def qingchu_cao(self): self.wenjian.clear() self.ico.clear() self.sczdwz.clear() if __name__ == "__main__": app = QApplication(sys.argv) window = WinDow() window.show() sys.exit(app.exec())
到此這篇關(guān)于Python pyinstaller實現(xiàn)圖形化打包工具的文章就介紹到這了,更多相關(guān)Python pyinstaller打包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用pandas和matplotlib實現(xiàn)繪制堆疊柱狀圖
在數(shù)據(jù)可視化中,堆疊柱狀圖是一種常用的圖表類型,它能夠清晰地展示多個類別的數(shù)據(jù),本文將演示如何使用 Python 的 pandas 和 matplotlib 庫繪制優(yōu)化的堆疊柱狀圖,需要的可以參考下2023-11-11python中出現(xiàn)invalid?syntax報錯的幾種原因分析
這篇文章主要介紹了python中出現(xiàn)invalid?syntax報錯的幾種原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02淺談django url請求與數(shù)據(jù)庫連接池的共享問題
今天小編就為大家分享一篇淺談django url請求與數(shù)據(jù)庫連接池的共享問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python實現(xiàn)將range()函數(shù)生成的數(shù)字存儲在一個列表中
這篇文章主要介紹了python實現(xiàn)將range()函數(shù)生成的數(shù)字存儲在一個列表中,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python中l(wèi)ogging.NullHandler 的使用教程
這篇文章主要介紹了Python中l(wèi)ogging.NullHandler 的使用教程,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下2018-11-11Python Django中的STATIC_URL 設(shè)置和使用方式
這篇文章主要介紹了Python Django中的STATIC_URL 設(shè)置和使用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03