Я хочу отобразить пользовательский значок в окне PyQt после замораживания базовой линии с помощью cx_Freeze.Значок отображается нормально, когда незамерзающий скрипт выполняется из среды IDE (для меня Spyder).Я использую PyQt5, Python 3.6 и Windows 10. Вот мой скрипт Python (IconTest.py
), который создает главное окно и показывает путь к значку и существует ли путь.Файл значка должен находиться в том же каталоге, что и IconTest.py
:
import sys, os
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(200, 300, 600, 100)
if getattr(sys, 'frozen', False): #If frozen with cx_Freeze
self.homePath = os.path.dirname(sys.executable)
else: # Otherwise, if running as a script (e.g., within Spyder)
self.homePath = os.path.dirname(__file__)
self.iconFileName = os.path.join(self.homePath, 'myIcon.ico')
self.setWindowIcon(QIcon(self.iconFileName))
self.setWindowTitle('Icon')
self.label1 = QLabel(self)
self.label2 = QLabel(self)
self.label1.move(10, 20)
self.label2.move(10, 40)
self.label1.setText("Path to icon file: " + str(self.iconFileName))
self.label2.setText("Does file exit? " + str(os.path.exists(self.iconFileName)))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Вот мой результат при запуске скрипта из Spyder (незамерзший).Как видите, отображается значок, напоминающий секундомер:
Вот мой setup.py для создания замороженной базовой линии:
from cx_Freeze import setup, Executable
import os, sys
exeDir = os.path.dirname(sys.executable)
platformsPath = os.path.join(exeDir, "Library\\Plugins\\Platforms\\")
iconPath = os.path.join(os.path.dirname(__file__), "myIcon.ico")
exe=Executable(script="IconTest.py", base = "Win32GUI", icon = iconPath)
includes=[iconPath, platformsPath]
excludes=[]
packages=[]
setup(
version = "0.1",
description = "My Icon Demo",
options = {'build_exe': {'excludes':excludes,'packages':packages,'include_files':includes}},
executables = [exe]
)
Вот мой результат при запуске замороженного скрипта (исполняемый файл в каталоге build
).Как видите, значок секундомера заменен общим значком Windows:
Предложения?