PyQt5 打包没有icon图标,百度方法没用,终极解决之道究竟在哪(pyinstaller打包成exe文件,双击打开,没有显示图标)

本文解决了一个常见的PyQt5应用打包为exe后图标不显示的问题。通过创建images.qrc资源文件,使用pyrcc5工具将图标转换为二进制,并在代码中正确设置图标路径,最终实现了图标在所有场景下的正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在分享之前,先爆下粗口,wtfk。太难了,整整折腾了一下午。才搞定。

pyqt5打包成exe,程序有图标,但是双击打开的任务栏和窗口都没有显示图标。百度的方法基本上用烂掉了。解决不了。最后在一个犄角旮旯的地方找到了解决方案:

问题复现

打包命令

pyinstaller -F -w -i favicon.ico update.py

程序显示图标了,但是点进去,图标没了!

直接在pycharm上预览,图标是有。

百度的方法用了,还是没图标,设置绝对路径之类的。有没有什么方法可以连图标一起打包呢?

如果设置了绝对路径,把程序拷贝到其他电脑,图标也就没了

 

解决办法:

1、创建images.qrc文件,写入以下内容:

<RCC> 
    <qresource prefix="/"> 
        <file>favicon.ico</file>
     </qresource> 
</RCC>

2、生成py文件,这个py文件把图片保存成二进制:

pyrcc5 -o test.py images.qrc

3、导入模块,设置图标

import test 
MainWindow.setWindowIcon(QIcon(':/favicon.ico'))

问题解决。

 

以下是一个简单的实现界面化的Python3.10代码,可以将多个ptx文件合并为一个,并且可以打包exe文件: ```python import sys import os from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog, QPushButton, QProgressBar, QLabel from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt, QThread, pyqtSignal class MergeThread(QThread): progress_signal = pyqtSignal(int) def __init__(self, input_path, output_path, output_name): super().__init__() self.input_path = input_path self.output_path = output_path self.output_name = output_name def run(self): ptx_files = [f for f in os.listdir(self.input_path) if f.endswith('.ptx')] total_size = sum(os.path.getsize(os.path.join(self.input_path, f)) for f in ptx_files) merged_file = open(os.path.join(self.output_path, self.output_name + '.ptx'), 'wb') progress = 0 for f in ptx_files: with open(os.path.join(self.input_path, f), 'rb') as file: merged_file.write(file.read()) progress += os.path.getsize(os.path.join(self.input_path, f)) self.progress_signal.emit(int(progress * 100 / total_size)) merged_file.close() class App(QWidget): def __init__(self): super().__init__() self.title = 'PTX文件合并工具' self.left = 10 self.top = 10 self.width = 500 self.height = 300 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.setWindowIcon(QIcon('icon.png')) input_folder_button = QPushButton('选择输入文件夹', self) input_folder_button.move(20, 20) input_folder_button.clicked.connect(self.select_input_folder) output_folder_button = QPushButton('选择输出文件夹', self) output_folder_button.move(20, 70) output_folder_button.clicked.connect(self.select_output_folder) output_name_label = QLabel('输出文件名:', self) output_name_label.move(20, 120) self.output_name_input = QLineEdit(self) self.output_name_input.move(120, 120) merge_button = QPushButton('开始合并', self) merge_button.move(20, 170) merge_button.clicked.connect(self.merge_ptx) self.progress_bar = QProgressBar(self) self.progress_bar.setGeometry(20, 220, 460, 20) self.progress_bar.setVisible(False) def select_input_folder(self): self.input_folder = str(QFileDialog.getExistingDirectory(self, "选择输入文件夹")) if self.input_folder: print("选择的输入文件夹为: " + self.input_folder) def select_output_folder(self): self.output_folder = str(QFileDialog.getExistingDirectory(self, "选择输出文件夹")) if self.output_folder: print("选择的输出文件夹为: " + self.output_folder) def merge_ptx(self): if not hasattr(self, 'input_folder'): return if not hasattr(self, 'output_folder'): return output_name = self.output_name_input.text() if not output_name: return self.progress_bar.setVisible(True) self.progress_bar.setValue(0) merge_thread = MergeThread(self.input_folder, self.output_folder, output_name) merge_thread.progress_signal.connect(self.update_progress_bar) merge_thread.start() def update_progress_bar(self, value): self.progress_bar.setValue(value) if __name__ == '__main__': app = QApplication(sys.argv) ex = App() ex.show() sys.exit(app.exec_()) ``` 代码说明: 1. 程序界面使用PyQt5实现,包括选择输入文件夹、选择输出文件夹、输入输出文件名和开始合并按钮。 2. 合并功能在`MergeThread`类中实现,继承自QThread类。具体实现为:获取输入文件夹中所有ptx文件,将它们合并为一个文件,并保存到输出文件夹中。在合并过程中,通过进度条来显示合并的进度。 3. 程序在主线程中运行,点击开始合并按钮时,会创建一个`MergeThread`的实例,并将其启动。在合并过程中,主线程会一直运行,并且更新进度条的值。 4. 程序可以打包exe文件,可以使用pyinstaller等工具来实现。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独行侠_阿涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值