用 PyInstaller 打包.py 文件
2021/1/4
背景
课程设计要用 PyQt 制作 GUI 并打包成.exe 文件,在学习 PyQt,就做了一个读取图片的小小程序,顺便试一下用 PyInstaller 打包。
注释
PyInstaller 的装置
我用的时候发现曾经装好了,应该是我大三试着玩的时候装的,这里就不表了。
PyInstaller 的应用
win + R
关上运行窗口,输出cmd
后回车进入控制台-
进入要打包的 py 文件的目录
- 输出
d:
进入 D 盘 - 输出
cd D:\_study\Grade4-1\CourseDesign\learn_PyQt\mine
进入 py 文件所在文件夹
- 输出
-
输出指令
pyinstaller -F -w -i favicon.ico mine.py
-F
生成的 dist 文件夹只含有单个的 exe 程序-w
exe 文件关上时只有指标窗口,没有俊俏的控制台-i favicon.ico
为程序加上指定门路的图标,这里只能是 ico 文件,jpg 会报错我试了mine.py
筹备打包的 py 文件- 各种参数的含意和用法在附录链接的文章中有具体介绍
- 期待打包实现即可
关上 exe 文件
打包实现后文件夹里会新呈现以下货色
_pycache_
build
dist
三个文件夹mine.spec
exe 文件即在 dist 文件夹中,点击运行即可
过程中遇到的问题及解决
图标格局
- 必须是 ico,用 jpg 在打包时会报错
程序中要用到的图片素材等
- 在代码援用素材时中应用相对路径
'res/faye.jpg'
- 打包完结后将
res
文件夹复制一份放在与 exe 文件并列的地位
其余
- 仿佛 须要在零碎的主 python 环境中装置须要的库,我的 PyQt 一开始只装在 anaconda 创立的虚拟环境中,造成打包后点击 exe 不呈现图形界面,在主环境中装置 PyQt5 后问题解决
总结
这是我第一次写博文来记录学习,也是第一次应用 markdown 编辑文本,有些青涩见谅:)
感激 plb 消耗 100+mb 流量帮我测试生疏环境下的程序运行。
附录
PyInstaller 各参数含意
繁难图形程序的代码
import sys
import cv2
import numpy
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QLineEdit
from PyQt5.QtGui import QIcon
from random import randint
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
# self.filename = 'a.jpg'
def initUI(self):
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('读取图片')
self.setWindowIcon(QIcon('res/faye.jpg'))
self.bt1 = QPushButton('读取', self)
self.bt1.setGeometry(115, 90, 70 ,30)
self.bt1.setToolTip('<b> 点击这里读取图片 </b>')
self.bt1.clicked.connect(self.showMessage)
self.text = QLineEdit('在这里输出文件门路(不要含有中文)', self)
self.text.selectAll()
self.text.setFocus()
self.text.setGeometry(25, 50, 250 ,30)
self.show()
def showMessage(self):
filename = self.text.text()
# print(filename)
img = cv2.imread(filename)
img1 = cv2.imread('a.jpg')
if type(img) == type(img1):
QMessageBox.about(self, '小问题...','门路如同错了')
self.text.selectAll()
self.text.setFocus()
else:
cv2.imshow(filename, img)
cv2.waitKey(0)
self.text.clear()
self.text.setText('在这里输出文件门路(不要含有中文)')
self.text.selectAll()
self.text.setFocus()
def closeEvent(self, event):
reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())