2008-09-18 34 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。 :)

相關問題