2008-09-18 17 views
7

मेरे पास py2exe से उत्पन्न एक exe फ़ाइल है। setup.py में मैं एक आइकन निर्दिष्ट exe में एम्बेड करने के लिए:आप PyWin32 के साथ 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) 

लेकिन यह एक (बहुत unspecific) त्रुटि पैदा करता है:
pywintypes.error: (0, 'LoadImage', 'कोई त्रुटि संदेश उपलब्ध है')

अगर मैं एक स्ट्रिंग के रूप में 0 निर्दिष्ट करने का प्रयास

pywintypes.error: (1813, 'LoadImage', '। निर्दिष्ट संसाधन प्रकार छवि फ़ाइल में नहीं पाया जा सकता')

तो, क्या सही विधि है
hicon = win32gui.LoadImage(hinst, '0', win32con.IMAGE_ICON, 0, 0, win32con.LR_DEFAULTSIZE) 

तो मैं त्रुटि मिलती है/आइकन लोड करने के लिए वाक्यविन्यास?
कृपया ध्यान दें कि मैं किसी भी GUI टूलकिट का उपयोग नहीं करता - केवल विंडोज एपीआई PyWin32 के माध्यम से।

उत्तर

5

@efotinis: आप सही हैं।

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

ध्यान रखें कि आईडी आप setup.py में आइकन दिया नहीं है:

यहाँ एक समाधान जब तक py2exe तय हो जाता है और आप एक ही आइकन दो बार शामिल करने के लिए नहीं करना चाहती है (जो आइकन समूह आईडी है), लेकिन संसाधन आईडी स्वचालित रूप से प्रत्येक आइकन समूह में प्रत्येक आइकन पर py2exe द्वारा असाइन किया गया है। कम से कम मैं इसे समझता हूं।

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) 
+0

आह, हाँ। मैं उसके बारे में भूल गया। अच्छा पकड़ा। – efotinis

0

आप 0 के अलावा कुछ करने के लिए आइकन आईडी स्थापित करना चाहिए:

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

विंडोज संसाधन आईडी 1 और 32767.

+0

दुख की बात है एक उच्च ID:

आप एक निर्दिष्ट आकार के साथ एक आइकन बनाने के लिए (के रूप में CreateIconFromResource सिस्टम डिफ़ॉल्ट आइकन आकार उपयोग करता है) चाहते हैं, आप CreateIconFromResourceEx, जो PyWin32 के माध्यम से उपलब्ध नहीं है उपयोग करने की आवश्यकता या तो काम नहीं करता है। –

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

अच्छा, अच्छा ... मैंने py2exe स्थापित किया और मुझे लगता है कि यह एक बग है। Py2exe_util.c में उन्हें 0.12 के बजाय rt_icon_id से 1 में डालना चाहिए। जिस तरह से यह है, लोडइकॉन/लोड इमेज का उपयोग करके पहले आइकन के पहले प्रारूप को लोड करना असंभव है।

मैं डेवलपर्स को इसके बारे में सूचित करूंगा यदि यह पहले से ही ज्ञात समस्या नहीं है।

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

आप एक दूसरे लोड कर सकते हैं, जबकि विंडोज शेल चिह्न के रूप में पहले एक का उपयोग करेगा:

का संभावित हल, इस बीच, एक ही चिह्न शामिल करने के लिए दो बार अपने setup.py में होगा । यद्यपि गैर-शून्य आईडी का उपयोग करना याद रखें। :)

संबंधित मुद्दे