كيف يمكنك تحميل جزءا لا يتجزأ من رمز من ملف exe مع PyWin32?

StackOverflow https://stackoverflow.com/questions/90775

  •  01-07-2019
  •  | 
  •  

سؤال

لدي ملف exe ولدت مع py2exe.في 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', 'نوع المورد المحدد لا يمكن العثور عليها في ملف الصورة.')

إذا ما هي الطريقة الصحيحة/جملة لتحميل رمز ؟
كما يرجى ملاحظة أن لا تستخدم أي أدوات واجهة المستخدم الرسومية - فقط Windows API عبر PyWin32.

هل كانت مفيدة؟

المحلول

@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)

نصائح أخرى

إذا كنت تستخدم 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.ج ينبغي أن الحرف الأول rt_icon_id 1 بدلا من 0.على ما هو عليه الآن من المستحيل لتحميل أول شكل الرمز الأول باستخدام LoadIcon/LoadImage.

سأعلم المطورين حول هذا إذا لم تكن بالفعل مشكلة معروفة.

الحل في هذه الأثناء أن تشمل نفس الأيقونة مرتين في setup.py:

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

يمكنك تحميل في ثانية واحدة ، في حين سوف يستخدم Windows أول واحد كما قذيفة رمز.تذكر أن استخدام غير الصفر معرفات على الرغم من.:)

يجب عليك تعيين رمز معرف إلى شيء آخر غير 0:

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

ويندوز معرفات الموارد يجب أن تكون بين 1 و 32767.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top