我已经使用
self.setWindowIcon(QtGui.QIcon('icon.png'))
为我的 PyQt 应用程序设置了图标,当我在 PyCharm 中运行代码时它工作正常。
接下来我使用 PyInstaller 将我的应用程序转换为一个文件:
pyinstaller.exe --onefile --windowed opc.py --name myapps
但是,运行可执行文件时,不会显示图标。我做错了什么?
左侧站点代码来自 PyCharm,右侧站点来自一个文件 (
pyinstaller.exe --onefile --windowed opc.py --name myapps
)。
为什么不一样呢?
我想要 .png
图标,因为它是透明的。
在 Windows 上运行可执行文件时显示的图标来自可执行文件本身。要将图标与您的应用程序捆绑在一起,您需要在使用
pyinstaller.exe
构建时通过传递 --icon
参数来指定图标。例如:
pyinstaller.exe --onefile --windowed --name myapps --icon=icon.ico opc.py
请注意,与
setWindowIcon()
不同,图标文件必须采用 .ico
格式,因此您需要先将其从 .png
转换。
如果您想使用 PyQt 调用来设置图标,您需要将图标文件捆绑到可执行文件中,这可以使用 PyInstaller spec 文件 来完成。创建和修改规范文件的过程的演练位于之前的答案。
我通过以下方式解决问题
我在代码中调用资源:
class MainWindow(QMainWindow):
def __init__(self):
icon_path = os.path.join(sys._MEIPASS, 'icon.ico')
self.setWindowIcon(QIcon(icon_path))
sys._MEIPASS允许您访问程序执行期间生成的临时文件
我在可执行文件中添加资源:
$python -m PyInstaller --onefile --noconsole --icon=icon.ico --add-data "icon.ico;." main.py
要同时兼容
.py
和 .exe
,您可以执行以下操作:
if getattr(sys, 'frozen', False):
applicationPath = sys._MEIPASS
elif __file__:
applicationPath = os.path.dirname(__file__)
app = QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon(os.path.join(applicationPath, "Icon.ico")))
对于您的 pyinstaller 调用:
pyinstaller --icon=Icon.ico --add-data="Icon.ico;." "main.py"