2008-09-18 11 views
7

Ich habe eine EXE-Datei mit py2exe generiert. Im setup.py ich ein Symbol angeben, die in der EXE-Datei eingebettet werden:Wie lädst du ein eingebettetes Icon aus einer exe-Datei mit PyWin32?

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

Ich habe versucht, das Symbol Laden mit:

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

Aber dies erzeugt einen (sehr unspezifisch) Fehler:
pywintypes.error: (0, 'Loadimage', 'wird keine Fehlermeldung vorhanden')

Wenn ich versuche, die Angabe 0 als String

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

dann bekomme ich den Fehler:
pywintypes.error: (1813, ‚Loadimage‘, ‚Der angegebene Ressourcentyp nicht in der Bilddatei gefunden werden kann‘)

Also, was ist die richtige Methode/Syntax um das Icon zu laden?
Bitte beachten Sie auch, dass ich kein GUI-Toolkit verwende - nur die Windows-API über PyWin32.

Antwort

5

@efotinis: Sie haben Recht. Hier

ist eine Abhilfe, bis py2exe behoben wird, und Sie wollen nicht das gleiche Symbol umfassen zweimal:

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

Beachten Sie, dass ist nicht die ID, die Sie auf das Symbol in setup.py gab (Dies ist die ID der Symbolgruppe), aber die Ressourcen-ID automatisch zugewiesen von py2exe jedem Symbol in jeder Icon-Gruppe. Zumindest verstehe ich es so.

Wenn Sie ein Symbol mit einer bestimmten Größe erstellt werden soll (wie CreateIconFromResource das System Standard-Icon-Größe verwendet), müssen Sie CreateIconFromResourceEx verwenden, die über PyWin32 nicht verfügbar:

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

Ah, ja. Ich habe das vergessen. Netter Fang. – efotinis

0

Sie sollten das Symbol ID auf etwas anderes als 0 gesetzt:

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

Windows-IDs Ressource sein muss zwischen 1 und 32767

+0

Leider eine höhere ID funktioniert auch nicht. –

1

Wenn Sie wxPython verwenden, können Sie das folgende einfachen Code:

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

ich in der Regel Code haben, der es aus einer EXE überprüft, ob oder nicht ausgeführt wird, und dementsprechend handelt:

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

Nun, gut ... Ich habe py2exe installiert und ich denke, es ist ein Fehler. In py2exe_util.c sollten sie rt_icon_id auf 1 statt auf 0 initiieren. Wie es jetzt ist, ist es unmöglich, das erste Format des ersten Icons mit LoadIcon/LoadImage zu laden.

Ich werde die Entwickler darüber informieren, wenn es nicht bereits ein bekanntes Problem ist.

Eine Abhilfe, in der Zwischenzeit wäre das gleiche Symbol zweimal in Ihrem setup.py enthält:

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

Sie die zweiten laden kann, während Windows die ersten als Shell-Symbol verwenden . Denken Sie daran, nicht-Null-IDs zu verwenden. :)