7

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', 'No error message is available')

文字列として 0 を指定しようとすると

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

次に、次のエラーが表示されます:
pywintypes.error: (1813, 'LoadImage', '指定されたリソース タイプがイメージ ファイルに見つかりません。')

では、アイコンをロードするための正しい方法/構文は何ですか?
また、私は GUI ツールキットを使用していないことに注意してください。PyWin32 経由の Windows API のみを使用しています。

4

4 に答える 4

5

@efotinis:その通りです。

py2exeが修正され、同じアイコンを2回含めたくない場合の回避策は次のとおりです。

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

1はsetup.pyでアイコンに付けたID(アイコングループID)ではなく、py2exeによって各アイコングループの各アイコンに自動的に割り当てられるリソースIDであることに注意してください。少なくともそれが私がそれを理解する方法です。

指定されたサイズのアイコンを作成する場合(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)
于 2008-09-21T11:07:16.027 に答える
1

まあ、まあ... py2exeをインストールしましたが、バグだと思います。py2exe_util.crt_icon_idでは、0 ではなく 1 に初期化する必要があります。現在の方法では、LoadIcon/LoadImage を使用して最初のアイコンの最初の形式をロードすることはできません。

まだ既知の問題でない場合は、開発者に通知します。

当面の回避策は、setup.py に同じアイコンを 2 回含めることです。

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

2 番目のものをロードできますが、Windows は最初のものをシェル アイコンとして使用します。ただし、ゼロ以外の ID を使用することを忘れないでください。:)

于 2008-09-18T13:52:27.663 に答える
1

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)
于 2008-09-18T11:10:35.027 に答える
0

アイコン ID を 0 以外に設定する必要があります。

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

Windows リソース ID は 1 から 32767 の間でなければなりません。

于 2008-09-18T09:41:01.247 に答える