Python pyinstaller實(shí)現(xiàn)圖形化打包工具
1.簡(jiǎn)介
一個(gè)使用Python PYQT5制作的關(guān)于pyinstaller打包工具,代替?zhèn)鹘y(tǒng)的cmd黑窗口模式打包頁面,實(shí)現(xiàn)更快捷方便的python打包體驗(yàn)。資源已打包,大家可自行下載。
相關(guān)功能:
- 識(shí)別是否安裝了pyinstaller,如果沒有的話,打開在左上角會(huì)提示,并在右上角增加“安裝”按鈕。
- 打包過程設(shè)置為隱式。并且加入“顯示處理”選項(xiàng)。
- 支持一鍵拖拽文件以及自動(dòng)選擇文件。
- 支持導(dǎo)出到桌面以及設(shè)置打包好的軟件圖標(biāo)。
pyinstaller 相關(guān)參數(shù):
-F 制作獨(dú)立的可執(zhí)行程序
-D 制作出的檔案存放在同一個(gè)文件夾下(默認(rèn)值)
-K 包含TCL/TK(對(duì)于使用了TK的,最好加上這個(gè)選項(xiàng),否則在未安裝TK的電腦上無法運(yùn)行)
-w 制作窗口程序
-c 制作命令行程序(默認(rèn))
-X 制作使用UPX壓縮過的可執(zhí)行程序(推薦使用這個(gè)選項(xiàng),需要下載UPX包,解壓后upx.exe放在Python(非PyInstaller)安裝目錄下,下載upx308w.zip)
-o DIR 指定輸出SPEC文件路徑(這也決定了最后輸出的exe文件路徑)
–icon=[ICO文件路徑] 指定程序圖標(biāo)
-v [指定文件] 指定程序版本信息
-n [指定程序名] 指定程序名稱
–distpath=D:/dist 輸出到指定位置
2.運(yùn)行效果

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("注意:命令行程序請(qǐng)勾選此選項(xiàng),否則運(yùn)行時(shí)會(huì)提示以下報(bào)錯(cuò)\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, "請(qǐng)選擇一個(gè)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, "請(qǐng)選擇一個(gè)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("打鉤后才會(huì)顯示選擇按鈕")
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實(shí)現(xiàn)圖形化打包工具的文章就介紹到這了,更多相關(guān)Python pyinstaller打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用pandas和matplotlib實(shí)現(xiàn)繪制堆疊柱狀圖
在數(shù)據(jù)可視化中,堆疊柱狀圖是一種常用的圖表類型,它能夠清晰地展示多個(gè)類別的數(shù)據(jù),本文將演示如何使用 Python 的 pandas 和 matplotlib 庫繪制優(yōu)化的堆疊柱狀圖,需要的可以參考下2023-11-11
python中出現(xiàn)invalid?syntax報(bào)錯(cuò)的幾種原因分析
這篇文章主要介紹了python中出現(xiàn)invalid?syntax報(bào)錯(cuò)的幾種原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
淺談django url請(qǐng)求與數(shù)據(jù)庫連接池的共享問題
今天小編就為大家分享一篇淺談django url請(qǐng)求與數(shù)據(jù)庫連接池的共享問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python實(shí)現(xiàn)將range()函數(shù)生成的數(shù)字存儲(chǔ)在一個(gè)列表中
這篇文章主要介紹了python實(shí)現(xiàn)將range()函數(shù)生成的數(shù)字存儲(chǔ)在一個(gè)列表中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python中小數(shù)點(diǎn)后的位數(shù)問題
這篇文章主要介紹了python中小數(shù)點(diǎn)后的位數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Python中l(wèi)ogging.NullHandler 的使用教程
這篇文章主要介紹了Python中l(wèi)ogging.NullHandler 的使用教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-11-11
Python Django中的STATIC_URL 設(shè)置和使用方式
這篇文章主要介紹了Python Django中的STATIC_URL 設(shè)置和使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03

