PyWin32を使用してexeファイルから埋め込みアイコンをロードするにはどうすればよいですか?
質問
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.エラー:(0, 'LoadImage', 'エラー メッセージはありません')
文字列として0を指定してみると
hicon = win32gui.LoadImage(hinst, '0', win32con.IMAGE_ICON, 0, 0, win32con.LR_DEFAULTSIZE)
その後、エラーが発生します:
pywintypes.エラー:(1813, 'LoadImage', '指定されたリソース タイプがイメージ ファイル内に見つかりません。')
では、アイコンを読み込むための正しい方法/構文は何でしょうか?
また、GUI ツールキットは一切使用せず、PyWin32 経由の Windows API のみを使用していることに注意してください。
解決
@efotinis:あなたが正しい。
py2exe が修正され、同じアイコンを 2 回含めたくない場合の回避策は次のとおりです。
hicon = win32gui.CreateIconFromResource(win32api.LoadResource(None, win32con.RT_ICON, 1), True)
を注意 1 これは setup.py でアイコンに指定した ID (アイコン グループ ID) ではなく、リソース ID です。 自動的に py2exe によって各アイコン グループの各アイコンに割り当てられます。少なくとも私はそう理解しています。
指定したサイズのアイコンを作成する場合 (CreateIconFromResource はシステムのデフォルトのアイコン サイズを使用するため)、CreateIconFromResourceEx を使用する必要がありますが、これは 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)
他のヒント
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 に 2 回含めることです。
'icon_resources': [(1, 'my_icon.ico'), (2, 'my_icon.ico')]
2 番目のアイコンをロードすることもできますが、Windows は最初のアイコンをシェル アイコンとして使用します。ただし、ゼロ以外の ID を使用することを忘れないでください。:)
アイコン ID を 0 以外に設定する必要があります。
'icon_resources': [(42, 'my_icon.ico')]
Windows リソース ID は 1 ~ 32767 である必要があります。