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.エラー:(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 である必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top