Как Вы загружаете встроенный значок из EXE-файла с PyWin32?

Мне нужно всего 24 байта.

Компилятору требуется пространство для обратного адреса и базового указателя. Поскольку вы находитесь в режиме 64 бит, это еще 16 байт. Всего 40. Разорвите это до 32-байтной границы, и вы получите 64.

7
задан Andreas Thomas 18 September 2008 в 08:40
поделиться

4 ответа

@efotinis: Вы правы.

Вот обходное решение, пока py2exe не фиксируется, и Вы не хотите включать тот же значок дважды:

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

Знайте, что 1 не идентификатор, который Вы дали значку в setup.py (который является идентификатором группы значка), но идентификатор ресурса, автоматически присвоенный 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)
5
ответ дан 7 December 2019 в 07:53
поделиться

При использовании 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)
1
ответ дан 7 December 2019 в 07:53
поделиться

Ну, хорошо... Я установил py2exe, и я думаю, что это - ошибка. В py2exe_util.c они должны init rt_icon_id к 1 вместо 0. Путем это теперь, невозможно загрузить первый формат первого значка с помощью LoadIcon/LoadImage.

Я уведомлю разработчиков об этом, если это уже не будет известная проблема.

Обходное решение, тем временем, должно было бы включать тот же значок дважды в Ваш setup.py:

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

Можно загрузить второй, в то время как Windows будет использовать первый в качестве значка оболочки. Не забудьте использовать ненулевые идентификаторы все же.:)

1
ответ дан 7 December 2019 в 07:53
поделиться

Необходимо установить значок ID на что-то другое, чем 0:

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

Идентификаторы ресурса Windows должны быть между 1 и 32767.

0
ответ дан 7 December 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: