Frage

Ich habe eine exe-Datei mit py2exe generiert. Im setup.py ich ein Symbol angeben, in der EXE-Datei eingebettet werden:

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 das erzeugt einen (sehr unspezifisch) Fehler:
pywintypes.error: (0, 'Loadimage', 'Keine Fehlermeldung ist vorhanden')

Wenn ich versuche, 0 als String Angabe

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

Also, was ist die richtige Methode / Syntax, um das Symbol zu laden?
Beachten Sie auch bitte, dass ich keinen GUI-Toolkit verwenden -. Nur den Windows-API über PyWin32

War es hilfreich?

Lösung

@efotinis: Du hast Recht.

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

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

Beachten Sie, dass 1 ist nicht die ID, die Sie auf das Symbol in setup.py gab (die das Symbol Gruppen-ID ist), aber die Ressourcen-ID automatisch von py2exe zugewiesen auf jedes Symbol in jeder Symbolgruppe. Zumindest das ist, wie ich es verstehe.

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 ist:

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)

Andere Tipps

Wenn Sie wxPython verwenden, können Sie den folgenden einfachen Code verwenden:

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

ich in der Regel Code, der überprüft, ob es von einem EXE oder nicht läuft, und handelt entsprechend:

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)

Gut, gut ... Ich installierte py2exe und ich denke, dass es ein Fehler ist. In py2exe_util.c sollten sie init 1 rt_icon_id statt 0 So wie es jetzt ist, ist es unmöglich, das erste Format des ersten Symbols laden LoadIcon / Loadimage verwendet wird.

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 können die zweiten laden, während Windows die ersten als Shell-Symbol verwenden. Denken Sie daran, nicht-Null-IDs allerdings zu verwenden. :)

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

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

Ressourcen-IDs von Windows sein muss zwischen 1 und 32767.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top