我正在写一个使用PyQt做用户界面的Python程序。当我用python运行它时, QComboBox图标 被显示出来,正如预期的那样。然而,当我使用PyInstaller编译并运行程序后,我得到了一个错误(见下图),然后图标就不显示了。
我试过的方法是
奇怪的问题
图标是图片中的 QComboBox::down-arrow
选择器的样式表。
如何在使用PyInstaller后让这个图标显示出来?
错
qt.svg: Cannot open file '/Users/user.name/icons/wd-icon-prompts.svg', because: No such file or directory
编码
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
# QT Layout Doc: https://doc.qt.io/qt-5/layout.html
# Subclass QMainWindow to customise your application's main window
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("Example")
# label = QLabel("This is a PyQt5 window!")
combo = QComboBox()
combo.addItems(['Item 1', 'Item 2', 'Item 3'])
self.setCentralWidget(combo)
styleSheet = """
QComboBox {
background-color: #fff;
border: 1px solid #ced3d9;
border-radius: 3px;
color: #333333;
font: 14px;
height: 36px;
padding: 1px 0px 1px 3px;
padding: ;
margin: 50px;
min-width: 300px;
selection-background-color: #e8ebed;
}
QComboBox:editable {
background: #fff;
}
QComboBox::drop-down {
background: #fff;
border: 0;
subcontrol-origin: padding;
subcontrol-position: right;
width: 25px;
}
QComboBox::down-arrow {
image: url(icons/wd-icon-prompts.svg);
width: 26px;
height: 26px;
padding: 25px;
}
QComboBox::down-arrow:active {
}
QComboBox QAbstractItemView {
background: white;
}
"""
self.setStyleSheet(styleSheet)
def resource_path(self,relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.environ.get("_MEIPASS2",os.path.abspath("."))
return os.path.join(base_path, relative_path)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
规格文件
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['codeSample.py'],
pathex=['/Users/user.name/Desktop/SoapDayCode copy'],
binaries=[],
datas=[('icons/wd-icon-prompts.svg', '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,
[],
exclude_binaries=True,
name='codeSample',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='codeSample')
EDITS:
问题1)如何运行pyinstaller?
pyinstaller mycode.py
pyinstaller mycode.spec
问题2)如何运行.exe?
问题3).exe旁边是否有文件?如果有,那么它们是什么?
是的,有很多,因为我没有使用onefile选项。下面是一张图片
我知道这是个老问题,但我在使用Pyinstaller显示图片和StyleSheets时遇到了问题,我使用'.png'图片而不是'.svg'图片解决了这个问题。