报错代码:
Falied to execute script "demo" due to unhandled exception:
[Errno 2] No such file or directory :'./demo.ui'
使用的打包命令
pyinstaller --noconfirm --onefile --windowed --add-data "D:/Codes/demonstration/demo.ui;." "D:/Codes/demonstration/demo.py"
错误代码
import os
import sys
from PyQt5 import uic
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
# 通过加载UI文件启动GUI
#[这里使用的是相对路径,打包后,无法根据此路径找到ui文件]
self.ui = uic.loadUi("./demo.ui", self)
# 隐藏菜单栏
self.ui.setWindowFlags(Qt.FramelessWindowHint)
if __name__ == "__main__":
# 创建QApplication对象,作为GUI主程序入口
App = QApplication(sys.argv)
demo = Demo()
# 显示主窗体
demo.ui.show()
# 循环中等待退出程序
App.exec_()
解决方式
def resource_path(relative_path):
"""获取程序中所需文件资源的绝对路径"""
try:
# PyInstaller创建临时文件夹,将路径存储于_MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
完整代码
import os
import sys
from PyQt5 import uic
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget
def resource_path(relative_path):
"""获取程序中所需文件资源的绝对路径"""
try:
# PyInstaller创建临时文件夹,将路径存储于_MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
# 通过加载UI文件启动GUI
self.ui = uic.loadUi(resource_path("./demo.ui"), self)
# 隐藏菜单栏
self.ui.setWindowFlags(Qt.FramelessWindowHint)
if __name__ == "__main__":
# 创建QApplication对象,作为GUI主程序入口
App = QApplication(sys.argv)
demo = Demo()
# 显示主窗体
demo.ui.show()
# 循环中等待退出程序
App.exec_()