Question

J'ai un fichier exe généré avec py2exe. Dans le fichier setup.py, je spécifie qu'une icône doit être intégrée au fichier exe:

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

J'ai essayé de charger l'icône en utilisant:

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

Mais cela produit une erreur (très peu spécifique):
pywintypes.error: (0, 'LoadImage', 'Aucun message d'erreur n'est disponible')

Si j'essaie de spécifier 0 en tant que chaîne

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

alors j'obtiens l'erreur:
pywintypes.error: (1813, 'LoadImage', 'Le type de ressource spécifié est introuvable dans le fichier image.')

Alors, quelle est la méthode / syntaxe correcte pour charger l'icône?
Veuillez également noter que je n'utilise aucune boîte à outils graphique - uniquement l'API Windows via PyWin32.

Était-ce utile?

La solution

@efotinis: Vous avez raison.

Voici une solution de contournement jusqu'à ce que py2exe soit réparée et que vous ne vouliez pas inclure la même icône deux fois:

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

Sachez que 1 n'est pas l'identifiant que vous avez donné à l'icône dans setup.py (qui est l'ID du groupe d'icônes), mais l'identifiant de la ressource automatiquement attribué par py2exe. à chaque icône de chaque groupe d'icônes. Au moins c'est comme ça que je le comprends.

Si vous souhaitez créer une icône avec une taille spécifiée (car CreateIconFromResource utilise la taille de l'icône par défaut du système), vous devez utiliser CreateIconFromResourceEx, qui n'est pas disponible via 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)

Autres conseils

Si vous utilisez wxPython, vous pouvez utiliser le code simple suivant:

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

J'ai généralement un code qui vérifie s'il fonctionne à partir d'un fichier EXE ou non, et agit en conséquence:

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)

Eh bien, bien ... j'ai installé py2exe et je pense que c'est un bug. Dans py2exe_util.c, ils doivent initialiser rt_icon_id sur 1 au lieu de 0. De la manière actuelle, il est impossible de charger le premier format de la première icône à l'aide de LoadIcon / LoadImage.

Je préviendrai les développeurs à ce sujet s'il ne s'agit pas déjà d'un problème connu.

Une solution de contournement consiste à inclure deux fois la même icône dans votre fichier setup.py:

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

Vous pouvez charger le second tandis que Windows utilisera le premier comme icône du shell. N'oubliez pas d'utiliser des identifiants non nuls. :)

Vous devez définir l’icône de l’icône sur autre chose que 0:

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

Les identifiants de ressources Windows doivent être compris entre 1 et 32767.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top