使用PyInstaller后,QCombobox图标设置与样式表不显示。

问题描述 投票:0回答:1

我正在写一个使用PyQt做用户界面的Python程序。当我用python运行它时, QComboBox图标 被显示出来,正如预期的那样。然而,当我使用PyInstaller编译并运行程序后,我得到了一个错误(见下图),然后图标就不显示了。

我试过的方法是

  • 你会看到在我的规范文件中,我把文件路径放在'datas'里面。
  • 你会看到在我的代码中,我有必要的 resource_path 函数。在更大的程序中,我成功地使用它来连接一个SQLite数据库。

奇怪的问题

图标是图片中的 QComboBox::down-arrow 选择器的样式表。

  1. 当我提供绝对路径时(如代码中所示),图标在python中可以工作,但在PyInstaller中编译时就不行了。
  2. 当我使用resource_path()提供路径时,图标根本不工作。

如何在使用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?

  1. 第一次的时候。pyinstaller mycode.py
  2. 然后我编辑了规格文件,并将svg文件添加到datas中。
  3. 从现在开始,当排除故障。pyinstaller mycode.spec

问题2)如何运行.exe?

  • 编译后,我导航到distmycode,找到名为mycode的exe。我双击mycode

问题3).exe旁边是否有文件?如果有,那么它们是什么?

是的,有很多,因为我没有使用onefile选项。下面是一张图片

picture of file structure

python python-3.x pyqt pyqt5 pyinstaller
1个回答
0
投票

我知道这是个老问题,但我在使用Pyinstaller显示图片和StyleSheets时遇到了问题,我使用'.png'图片而不是'.svg'图片解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.