使用 PyInstaller 缺少按钮图标
Missing Button-Icons using PyInstaller
当我尝试使用 pyinstaller 创建一个 onefile 可执行文件时,所有按钮图标都被删除了。
我想使用相对路径,以便 .exe 也可以在其他计算机上运行。
我找到了一些旧帖子,但我没有让它们起作用。
Python-代码:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self, debugging=False):
super().__init__()
self.__setupUi()
self.__retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self)
self.show()
def __setupUi(self):
self.setObjectName('MainWindow')
self.resize(400, 100)
self.centralwidget=QtWidgets.QWidget(self)
self.centralwidget.setObjectName('centralwidget')
self.verticalLayout=QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName('verticalLayout')
self.pushButton=QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setText('')
icon=QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap('Icons/test.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.pushButton.setIcon(icon)
self.pushButton.setIconSize(QtCore.QSize(32, 32))
self.pushButton.setObjectName('pushButton')
self.verticalLayout.addWidget(self.pushButton)
self.setCentralWidget(self.centralwidget)
def __retranslateUi(self):
_translate=QtCore.QCoreApplication.translate
self.setWindowTitle(_translate('MainWindow', 'MainWindow'))
if __name__=='__main__':
app=QtWidgets.QApplication(sys.argv)
uiObj=Ui_MainWindow()
sys.exit(app.exec())
PyInstaller 命令:
python -m PyInstaller --onefile --windowed --add-data Icons/*.png;Icons test.py
以及.spec 内容:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['test.py'],
pathex=['C:\Users\User\Desktop\Neuer Ordner'],
binaries=[],
datas=[('Icons/*.png', 'Icons')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='test',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False )
那么如何解决这个问题呢?
谢谢
所以今天我找到了解决方案。这个旧的 post () 真的很有帮助。
我的文件夹结构例如:
Folder
- test.py
- absolutePath.py
- Icons
需要脚本 absolutePath.py 来生成 PNG 的绝对路径。文件夹 Icons 包含 PNG-Files.
absolutePath.py:
import sys
import os
def absolutePath(relative_path):
base_path=getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
test.py:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from absolutePath import absolutePath
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self, debugging=False):
super().__init__()
self.__setupUi()
self.__retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self)
self.show()
def __setupUi(self):
self.setObjectName('MainWindow')
self.resize(400, 100)
self.centralwidget=QtWidgets.QWidget(self)
self.centralwidget.setObjectName('centralwidget')
self.verticalLayout=QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName('verticalLayout')
self.pushButton=QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setText('')
icon=QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(absolutePath('Icons/icon.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.pushButton.setIcon(icon)
self.pushButton.setIconSize(QtCore.QSize(32, 32))
self.pushButton.setObjectName('pushButton')
self.verticalLayout.addWidget(self.pushButton)
self.setCentralWidget(self.centralwidget)
def __retranslateUi(self):
_translate=QtCore.QCoreApplication.translate
self.setWindowTitle(_translate('MainWindow', 'MainWindow'))
if __name__=='__main__':
app=QtWidgets.QApplication(sys.argv)
uiObj=Ui_MainWindow()
sys.exit(app.exec())
最后是 PyInstaller 命令:
python -m PyInstaller --onefile --windowed --add-data Icons\*.png;Icons\ test.py
如此生成的可执行文件包括文件夹中图标文件夹中的所有 PNG
称为图标。图片可以在运行时找到并出现。该可执行文件也可以在其他计算机上使用。
当我尝试使用 pyinstaller 创建一个 onefile 可执行文件时,所有按钮图标都被删除了。 我想使用相对路径,以便 .exe 也可以在其他计算机上运行。 我找到了一些旧帖子,但我没有让它们起作用。
Python-代码:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self, debugging=False):
super().__init__()
self.__setupUi()
self.__retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self)
self.show()
def __setupUi(self):
self.setObjectName('MainWindow')
self.resize(400, 100)
self.centralwidget=QtWidgets.QWidget(self)
self.centralwidget.setObjectName('centralwidget')
self.verticalLayout=QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName('verticalLayout')
self.pushButton=QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setText('')
icon=QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap('Icons/test.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.pushButton.setIcon(icon)
self.pushButton.setIconSize(QtCore.QSize(32, 32))
self.pushButton.setObjectName('pushButton')
self.verticalLayout.addWidget(self.pushButton)
self.setCentralWidget(self.centralwidget)
def __retranslateUi(self):
_translate=QtCore.QCoreApplication.translate
self.setWindowTitle(_translate('MainWindow', 'MainWindow'))
if __name__=='__main__':
app=QtWidgets.QApplication(sys.argv)
uiObj=Ui_MainWindow()
sys.exit(app.exec())
PyInstaller 命令:
python -m PyInstaller --onefile --windowed --add-data Icons/*.png;Icons test.py
以及.spec 内容:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['test.py'],
pathex=['C:\Users\User\Desktop\Neuer Ordner'],
binaries=[],
datas=[('Icons/*.png', 'Icons')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='test',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False )
那么如何解决这个问题呢? 谢谢
所以今天我找到了解决方案。这个旧的 post (
Folder
- test.py
- absolutePath.py
- Icons
需要脚本 absolutePath.py 来生成 PNG 的绝对路径。文件夹 Icons 包含 PNG-Files.
absolutePath.py:
import sys
import os
def absolutePath(relative_path):
base_path=getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
test.py:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from absolutePath import absolutePath
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self, debugging=False):
super().__init__()
self.__setupUi()
self.__retranslateUi()
QtCore.QMetaObject.connectSlotsByName(self)
self.show()
def __setupUi(self):
self.setObjectName('MainWindow')
self.resize(400, 100)
self.centralwidget=QtWidgets.QWidget(self)
self.centralwidget.setObjectName('centralwidget')
self.verticalLayout=QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName('verticalLayout')
self.pushButton=QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setText('')
icon=QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(absolutePath('Icons/icon.png')), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.pushButton.setIcon(icon)
self.pushButton.setIconSize(QtCore.QSize(32, 32))
self.pushButton.setObjectName('pushButton')
self.verticalLayout.addWidget(self.pushButton)
self.setCentralWidget(self.centralwidget)
def __retranslateUi(self):
_translate=QtCore.QCoreApplication.translate
self.setWindowTitle(_translate('MainWindow', 'MainWindow'))
if __name__=='__main__':
app=QtWidgets.QApplication(sys.argv)
uiObj=Ui_MainWindow()
sys.exit(app.exec())
最后是 PyInstaller 命令:
python -m PyInstaller --onefile --windowed --add-data Icons\*.png;Icons\ test.py
如此生成的可执行文件包括文件夹中图标文件夹中的所有 PNG 称为图标。图片可以在运行时找到并出现。该可执行文件也可以在其他计算机上使用。