【pyQT 专栏】程序设置 windows 任务栏缩略图(.ico)教程

pyQT 生成了一个exe,但是必须将 ico 文件放在 exe 文件夹目录下,缩略图才显示图标
 
 

这个问题是因为PyInstaller打包时,图标文件没有被正确嵌入到exe中,或者程序运行时找不到图标文件。以下是几种解决方案:

方案1:使用资源文件系统(推荐)

1. 创建资源文件 resources.qrc

<RCC>
    <qresource prefix="/">
        <file>audio_icon.ico</file>
        <file>audio_icon.png</file>
    </qresource>
</RCC>

2. 编译资源文件

pyrcc5 resources.qrc -o resources_rc.py

3. 修改主程序代码

import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import QFile, QIODevice

# 导入编译后的资源文件
import resources_rc

class AudioPlayer(QMainWindow):
    def __init__(self):
        super().__init__()
        
        # 设置应用程序图标
        self.set_app_icon()
        
        # 其他初始化代码...
    
    def set_app_icon(self):
        """设置应用程序图标"""
        try:
            # 方法1: 使用资源系统
            app_icon = QIcon(":/audio_icon.ico")
            self.setWindowIcon(app_icon)
            QApplication.setWindowIcon(app_icon)
            
        except Exception as e:
            print(f"设置图标失败: {e}")
            # 备用方法:使用内置的Qt图标
            self.setWindowIcon(QIcon.fromTheme("audio-volume-high"))
    

方案2:修改打包脚本,确保图标被正确包含

# build_exe.py
import PyInstaller.__main__
import os
import sys

def build_exe():
    current_dir = os.path.dirname(os.path.abspath(__file__))
    main_script = os.path.join(current_dir, "audio_player_gui.py")
    
    # 确保图标文件存在
    icon_path = os.path.join(current_dir, "audio_icon.ico")
    if not os.path.exists(icon_path):
        print(f"警告: 图标文件 {icon_path} 不存在!")
    
    params = [
        main_script,
        '--name=AudioPlayer',
        '--onefile',
        '--windowed',
        '--icon=' + icon_path,  # 使用绝对路径
        '--add-data=' + icon_path + ';.',  # 确保图标文件被包含
        '--add-data=audio_icon.png;.', 
        '--noconfirm',
        '--clean',
        '--hidden-import=PyQt5.QtCore',
        '--hidden-import=PyQt5.QtGui',
        '--hidden-import=PyQt5.QtWidgets',
        '--hidden-import=pygame',
        '--add-binary=audio_icon.ico;.',  # 使用add-binary确保图标被正确包含
    ]
    
    PyInstaller.__main__.run(params)

if __name__ == "__main__":
    build_exe()

方案2:使用base64嵌入图标(完全不需要外部文件)

import sys
import base64
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import QByteArray, QBuffer, QIODevice

class AudioPlayer(QMainWindow):
    def __init__(self):
        super().__init__()
        
        # 设置base64嵌入的图标
        self.set_base64_icon()
        
        # 其他初始化代码...
    
    def set_base64_icon(self):
        """使用base64编码的图标"""
        # 这里是一个示例base64编码的图标(你需要替换为你的图标base64)
        # 你可以使用在线工具将ico文件转换为base64
        icon_base64 = """
        AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAEAAA
        AAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
        /wD///8A////AP///wD///8A////AAAAAADMzMwAzMzMAMzMzADMzMwAzMzMAMzMzADMzMwAzMzM
        AMzMzADMzMwAzMzMAMzMzADMzMwAzMzMAMzMzADMzMwAAAAAAP///wD///8A////AP///wD///8A
        ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
        """
        
        try:
            # 解码base64并创建图标
            icon_data = base64.b64decode(icon_base64)
            pixmap = QPixmap()
            pixmap.loadFromData(icon_data)
            icon = QIcon(pixmap)
            
            self.setWindowIcon(icon)
            QApplication.setWindowIcon(icon)
            
        except Exception as e:
            print(f"设置base64图标失败: {e}")
            # 使用Qt内置图标作为备用
            self.setWindowIcon(QIcon.fromTheme("audio-volume-high"))

推荐使用方案1(资源文件系统),这是最可靠的方法,可以确保图标文件被正确嵌入到exe中,无论exe在什么位置运行都能正常显示图标。

posted @ 2025-09-16 23:48  FBshark  阅读(63)  评论(0)    收藏  举报