PyWin32를 사용하여 exe 파일에 포함된 아이콘을 어떻게 로드합니까?

StackOverflow https://stackoverflow.com/questions/90775

  •  01-07-2019
  •  | 
  •  

문제

py2exe로 생성된 exe 파일이 있습니다.setup.py에서 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만 사용한다는 점에 유의하시기 바랍니다.

도움이 되었습니까?

해결책

@efotinis:네가 옳아.

다음은 py2exe가 수정되고 동일한 아이콘을 두 번 포함하지 않을 때까지의 해결 방법입니다.

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

주의하세요 1 setup.py에서 아이콘에 부여한 ID(아이콘 그룹 ID)가 아니라 리소스 ID입니다. 자동으로 py2exe에 의해 각 아이콘 그룹의 각 아이콘에 할당됩니다.적어도 나는 그렇게 이해한다.

지정된 크기의 아이콘을 생성하려면(CreateIconFromResource가 시스템 기본 아이콘 크기를 사용하므로) PyWin32를 통해 사용할 수 없는 CreateIconFromResourceEx를 사용해야 합니다.

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)

다른 팁

wxPython을 사용하는 경우 다음과 같은 간단한 코드를 사용할 수 있습니다.

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)

글쎄요...py2exe를 설치했는데 버그인 것 같습니다.py2exe_util.c에서는 초기화해야 합니다. rt_icon_id 0 대신 1로.현재로서는 LoadIcon/LoadImage를 사용하여 첫 번째 아이콘의 첫 번째 형식을 로드하는 것이 불가능합니다.

아직 알려진 문제가 아닌 경우 개발자에게 이를 알립니다.

해결 방법은 setup.py에 동일한 아이콘을 두 번 포함하는 것입니다.

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

두 번째 아이콘을 로드할 수 있으며 Windows에서는 첫 번째 아이콘을 셸 아이콘으로 사용합니다.하지만 0이 아닌 ID를 사용하는 것을 잊지 마세요.:)

아이콘 ID를 0이 아닌 다른 값으로 설정해야 합니다.

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

Windows 리소스 ID는 1에서 32767 사이여야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top