2008-09-18 17 views
7

Mam plik exe generowane z py2exe. W setup.py określić ikonę, aby być osadzone w EXE:Jak załadować osadzoną ikonę z pliku exe za pomocą PyWin32?

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

Próbowałem ładowanie ikonę za pomocą:

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

Ale ta wywołuje bardzo niespecyficzne() Błąd:
pywintypes.error: (0, 'LoadImage', 'No komunikat o błędzie jest dostępny')

jeśli staram podając 0 jako ciąg

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

następnie pojawia się błąd:
pywintypes.error: (1813, „LoadImage”, „Określony typ zasobu nie może być znaleziony w pliku obrazu”)

Więc, jaka jest poprawna metoda/składnia do załadowania ikony?
Należy również zauważyć, że nie używam żadnego zestawu narzędzi GUI - tylko Windows API przez PyWin32.

Odpowiedz

5

@efotinis: Masz rację.

Oto obejście aż py2exe zostanie ustalona i nie chcą zawierać tę samą ikonę dwukrotnie:

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

mieć świadomość, że nie jest identyfikatorem daliście ikonę w setup.py (który jest identyfikatorem grupy ikon), ale identyfikator zasobu automatycznie przypisany przez py2exe do każdej ikony w każdej grupie ikon. Przynajmniej tak to rozumiem.

Jeśli chcesz utworzyć ikonę z określonym rozmiarze (jak CreateIconFromResource używa domyślnego rozmiaru ikon System), trzeba użyć CreateIconFromResourceEx, który nie jest dostępny poprzez 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) 
+0

Ah, tak. Zapomniałem o tym. Dobry chwyt. – efotinis

0

Należy ustawić ID ikonę, aby coś innego niż 0:

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

identyfikatory zasobów systemu Windows musi być pomiędzy 1 a 32767.

+0

niestety wyższa ID też nie działa. –

1

Jeśli używasz WxPython, można użyć następujących prosty kod:

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

zazwyczaj mam kod, który sprawdza, czy serwer działa z EXE czy też nie, i działa odpowiednio:

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

No cóż ... Zainstalowałem py2exe i myślę, że to błąd. W py2exe_util.c powinny one zainicjować rt_icon_id na 1 zamiast 0. Tak jak obecnie, niemożliwe jest załadowanie pierwszego formatu pierwszej ikony za pomocą LoadIcon/LoadImage.

Powiadomię deweloperów o tym, jeśli nie jest to znany problem.

Rozwiązaniem, w międzyczasie, będzie zawierać tę samą ikonę dwa razy w setup.py:

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

można załadować drugi, gdy system Windows użyje pierwszego jeden jako ikony powłoki . Pamiętaj jednak, aby używać niezerowych identyfikatorów. :)