【问题标题】:How do you load an embedded icon from an exe file with PyWin32?如何使用 PyWin32 从 exe 文件加载嵌入式图标?
【发布时间】:2008-09-18 07:46:43
【问题描述】:

我有一个用 py2exe 生成的 exe 文件。在 setup.py 中,我指定了一个要嵌入到 exe 中的图标:

windows=[{'script': 'my_script.py','icon_resources': [(0, 'my_icon.ico')], ...

我尝试使用以下方式加载图标:

hinst = win32api.GetModuleHandle(None)
hicon = win32gui.LoadImage(hinst, 0, win32con.IMAGE_ICON, 0, 0, win32con.LR_DEFAULTSIZE)

但这会产生一个(非常不具体的)错误:
pywintypes.error: (0, 'LoadImage', 'No error message is available')

如果我尝试将 0 指定为字符串

hicon = win32gui.LoadImage(hinst, '0', win32con.IMAGE_ICON, 0, 0, win32con.LR_DEFAULTSIZE)

然后我得到错误:
pywintypes.error: (1813, 'LoadImage', 'The specified resource type cannot be found in the image file.')

那么,加载图标的正确方法/语法是什么?
另外请注意,我不使用任何 GUI 工具包 - 只是通过 PyWin32 使用 Windows API。

【问题讨论】:

    标签: python icons exe pywin32


    【解决方案1】:

    @efotinis:你是对的。

    这是一个解决方法,直到 py2exe 得到修复并且您不想包含两次相同的图标:

    hicon = win32gui.CreateIconFromResource(win32api.LoadResource(None, win32con.RT_ICON, 1), True)
    

    注意1不是你在setup.py中给图标的ID(也就是图标组ID),而是py2exe自动分配的资源ID到每个图标组中的每个图标。至少我是这么理解的。

    如果你想创建一个指定大小的图标(因为 CreateIconFromResource 使用系统默认的图标大小),你需要使用 CreateIconFromResourceEx,这在 PyWin32 中是不可用的:

    icon_res = win32api.LoadResource(None, win32con.RT_ICON, 1)
    hicon = ctypes.windll.user32.CreateIconFromResourceEx(icon_res, len(icon_res), True,
        0x00030000, 16, 16, win32con.LR_DEFAULTCOLOR)
    

    【讨论】:

    • 啊,是的。我忘记了。不错的收获。
    【解决方案2】:

    如果您使用的是 wxPython,则可以使用以下简单代码:

    wx.Icon(sys.argv[0], wx.BITMAP_TYPE_ICO)
    

    我通常有代码检查它是否从 EXE 运行,并采取相应的行动:

    def get_app_icon():
        if hasattr(sys, "frozen") and getattr(sys, "frozen") == "windows_exe":
            return wx.Icon(sys.argv[0], wx.BITMAP_TYPE_ICO)
        else:
            return wx.Icon("gfx/myapp.ico", wx.BITMAP_TYPE_ICO)
    

    【讨论】:

      【解决方案3】:

      嗯,嗯...我安装了 py2exe,我认为这是一个错误。在 py2exe_util.c 中,他们应该将 rt_icon_id 初始化为 1 而不是 0。现在的方式是使用 LoadIcon/LoadImage 加载第一个图标的第一种格式是不可能的。

      如果这不是已知问题,我会通知开发人员。

      与此同时,一种解决方法是在 setup.py 中包含两次相同的图标:

      'icon_resources': [(1, 'my_icon.ico'), (2, 'my_icon.ico')]
      

      您可以加载第二个,而 Windows 将使用第一个作为外壳图标。但请记住使用非零 ID。 :)

      【讨论】:

        【解决方案4】:

        您应该将图标 ID 设置为 0 以外的值:

        'icon_resources': [(42, 'my_icon.ico')]
        

        Windows 资源 ID 必须介于 1 到 32767 之间。

        【讨论】:

          猜你喜欢
          • 2011-08-01
          • 1970-01-01
          • 2023-01-18
          • 2013-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-26
          相关资源
          最近更新 更多