![5a8f4a325237218b07b79a271b1cefd1.png](https://img-blog.csdnimg.cn/img_convert/5a8f4a325237218b07b79a271b1cefd1.png)
在使用PyQT5
制作GUI
时,经常需要用到本地资源,然而打包成exe
后,发送给其他小伙伴运行失败。原因与pyinstaller
运行机制有关。
Pyinstaller
可以将资源文件一起打包到exe
中,当exe
在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS访问临时文件夹中的资源
from PyQt5.Qt import QWidget, QApplication, QComboBox,QPalette,QBrush,QPixmap
import pandas as pd
import sys,os
class MyWin(QWidget):
def __init__(self):
super().__init__()
self.resize(300, 200)
combox = QComboBox(self) # 创建下拉按钮
combox.setGeometry(50, 50, 100, 20) # 设置下拉按钮(x,y,width,height)
filePath = self.file_path("test.xlsx")
print(filePath)
data = pd.read_excel(filePath) # 打开Excel文件
combox.addItems(data['城市']) # 设置下拉内容
def resizeEvent(self, event): # 尺寸修改事件
palettel = QPalette()
Background = self.file_path("timg.jpg") # 资源文件地址
palettel.setBrush(self.backgroundRole(),
QBrush(QPixmap(Background).scaled(self.width(), self.height()))) # 设置背景图片
self.setPalette(palettel)
def file_path(self,filename): # 生成资源文件目录访问路径
relative_path = os.path.join("resource", filename)
if getattr(sys, 'frozen', False): # 判断sys中是否存在frozen变量,
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWin()
win.show()
sys.exit(app.exec_())
if getattr(sys, 'frozen', False):
程序打包成exe
的时,会将一个变量frozen
注入到sys
中,这里使用判断,检测sys
是否有frozen
这个变量,如果有,就使用sys._MEIPASS
访问临时文件夹路径,如果没有,就使用当前路径,当程序不管是以PyInstaller打包后形式运行,还是本地测试,都能找到正确的资源路径。
先将上面测试代码生成spec
文件
![7fb5f69800f9a27d5fd238ee633f044f.png](https://img-blog.csdnimg.cn/img_convert/7fb5f69800f9a27d5fd238ee633f044f.png)
配置spec
文件:在datas
中表明需要将哪些文件添加到exe
,在临时文件中是什么名字
![50eb34cf9676a5a891fa220de48eeb1f.png](https://img-blog.csdnimg.cn/img_convert/50eb34cf9676a5a891fa220de48eeb1f.png)
生成EXE文件,pyinstaller -F test.spec
,注意这里是执行.spec
文件
![641c5688032a39a21e32c5725f974c0c.png](https://img-blog.csdnimg.cn/img_convert/641c5688032a39a21e32c5725f974c0c.png)
打包成功后,注意看调用的资源路径
![519544d57b57ccd51a54a7069094835f.png](https://img-blog.csdnimg.cn/img_convert/519544d57b57ccd51a54a7069094835f.png)
so easy
官方说明:https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation