python从exe里得到ico

说到exe那就是windows程序了,

python调用win32api 需要先安装https://github.com/mhammond/pywin32/releases
转化成ico有2种,一种是pyqt5另存图片换个文件名,这个可能不太专业,第2种是PythonMagick
https://download.lfd.uci.edu/pythonlibs/w3jqiv8s/PythonMagick-0.9.19-cp37-cp37m-win_amd64.whl
pip install PythonMagick-0.9.19-cp37-cp37m-win_amd64.whl
import sys
import win32ui
import win32gui
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PIL import Image
class testWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.initUI()

    def initUI(self):
        self.setGeometry(180.0, 130.0, 280.0, 400.0)
        self.setMouseTracking(True)
        argv=sys.argv
        if len(argv)>1:
            large, small = win32gui.ExtractIconEx(argv[1], 0)
        else:
            large, small = win32gui.ExtractIconEx(r"C:/work/Mail139_disk.exe", 0)
        win32gui.DestroyIcon(small[0])
        self.bitmapFromHIcon(large[0])
        #self.pixmap =QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]), 2)
        self.pixmap =QPixmap('icon.png')
        self.pixmap.save("a.ico","ico")
        
    def bitmapFromHIcon(self, hIcon):
        hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
        hbmp = win32ui.CreateBitmap()
        hbmp.CreateCompatibleBitmap(hdc, 32, 32)
        hdc = hdc.CreateCompatibleDC()
        hdc.SelectObject(hbmp)
        hdc.DrawIcon((0, 0), hIcon)
        hdc.DeleteDC()
        bmpstr=hbmp.GetBitmapBits(True)
        img = Image.frombuffer( 'RGBA',(32,32), bmpstr, 'raw', 'BGRA', 0, 1)
        img.save('icon.png')
        return hbmp.GetHandle()
    
    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(Qt.NoPen)
        painter.setBrush(QBrush(QColor(255.0, 255.0, 255.0, 255.0), Qt.SolidPattern))
        painter.drawRect(QRect(0.0, 0.0, 280.0, 400.0))
        painter.drawPixmap(QRect(0.0, 0.0, 32.0, 32.0), self.pixmap)
        painter.end()
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = testWindow()
    mainWindow.show()
    app.exec_()

注意fromWinHBITMAP 是pyqt4的函数pyqt5没有了,所以就简单点先存为png文件再转化ico,以上代码保存pyqtico.py,然后用下面命令使用:

python pyqtico.py C:/work/Mail139_disk.exe

PythonMagick的用法另一篇博客文章已经有过示例,就不用再写了,如果要打包pyqt5相当大,仅仅这个功能不值当用。此处代码仅仅为了练习,打包成exe的话记得win10打包只能到win10用,不能把exe放到xp之类其他os

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值