Pregunta

Tengo un archivo exe generado con py2exe.En setup.py especifico un ícono para incrustarlo en el exe:

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

Intenté cargar el ícono usando:

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

Pero esto produce un error (muy inespecífico):
pywintypes.error:(0, 'LoadImage', 'No hay ningún mensaje de error disponible')

Si intento especificar 0 como una cadena

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

entonces me sale el error:
pywintypes.error:(1813, 'LoadImage', 'El tipo de recurso especificado no se puede encontrar en el archivo de imagen.')

Entonces, ¿cuál es el método/sintaxis correcto para cargar el icono?
También tenga en cuenta que no uso ningún kit de herramientas GUI, solo la API de Windows a través de PyWin32.

¿Fue útil?

Solución

@efotinis:Tienes razón.

Aquí hay una solución alternativa hasta que se solucione py2exe y no desee incluir el mismo ícono dos veces:

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

Sé consciente de 1 no es la ID que le dio al ícono en setup.py (que es la ID del grupo de íconos), sino la ID del recurso automáticamente asignado por py2exe a cada ícono en cada grupo de íconos.Al menos así lo entiendo yo.

Si desea crear un ícono con un tamaño específico (ya que CreateIconFromResource usa el tamaño de ícono predeterminado del sistema), debe usar CreateIconFromResourceEx, que no está disponible a través de 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)

Otros consejos

Si está utilizando wxPython, puede utilizar el siguiente código simple:

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

Normalmente tengo un código que comprueba si se está ejecutando desde un EXE o no y actúa en consecuencia:

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)

Bien bien...Instalé py2exe y creo que es un error.En py2exe_util.c deberían iniciar rt_icon_id a 1 en lugar de 0.Tal como está ahora, es imposible cargar el primer formato del primer ícono usando LoadIcon/LoadImage.

Notificaré a los desarrolladores sobre esto si aún no es un problema conocido.

Mientras tanto, una solución alternativa sería incluir el mismo ícono dos veces en su setup.py:

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

Puede cargar el segundo, mientras que Windows usará el primero como icono de shell.Sin embargo, recuerde utilizar identificaciones distintas de cero.:)

Debes configurar el ID del icono en un valor distinto de 0:

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

Los ID de recursos de Windows deben estar entre 1 y 32767.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top