2008-09-18 101 views
7

我有一个用py2exe生成的exe文件。在setup.py我指定一个图标嵌入exe文件:如何使用PyWin32从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', '没有可用的错误信息')

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

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

然后我得到的错误:
pywintypes.error:(1813,“的LoadImage”,“指定的资源类型的图像文件中找到”)

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

回答

5

@efotinis:你说得对。

这是一种变通方法,直到py2exe获取固定的,你不希望包括两次相同的图标:

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

注意是不是你在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) 
+0

啊,是的。我忘了那个。很好的接收。 – efotinis 2008-09-22 18:57:20

0

您应该设置图标ID给其他的东西比0:

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

Windows资源ID必须是如果你使用的wxPython 1和32767

+0

可悲的是更高的ID也不起作用。 – 2008-09-18 11:37:10

1

之间,你可以使用下面的简单的代码:

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) 
1

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

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

一种解决方法,在此期间,将包括相同的图标两次在你的setup.py:

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

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