2014-01-12 5 views
0

В настоящее время я пытаюсь понять, как создать код, который будет принимать входное расширение файла, например '.png', и вернуть связанный значок с этим файловым типом в системе.Python-Сохранение/Доступ к значкам расширения файла и их использование в программе Tkinter

Я использую python 2.7.6 и использую Windows 8. Я искал код для этого в течение нескольких часов для вещей, близких к нему, сохраняя изображения из .exe-файлов, но не обнаруживая расширение файла в реестре и сохраняя его.

Я нашел код, который работает и позволяет мне сохранить файл как BMP, который в основном работает с использованием значка wxpython для растровых изображений и сохраняет изображение. Тем не менее, я бы просто не использовал код wxpython, так как я использую Tkinter для кодирования самого интерфейса.

Вот код, который в настоящее время работает (немного измененная) от http://ginstrom.com/scribbles/2007/08/31/file-list-with-icons-on-wxpython-windows/

import wx 
from win32com.shell import shell, shellcon 
from win32con import FILE_ATTRIBUTE_NORMAL 

def extension_to_bitmap(extension): 
    """dot is mandatory in extension""" 

    flags = shellcon.SHGFI_SMALLICON | \ 
      shellcon.SHGFI_ICON | \ 
      shellcon.SHGFI_USEFILEATTRIBUTES 

    retval, info = shell.SHGetFileInfo(extension, 
         FILE_ATTRIBUTE_NORMAL, 
         flags) 
    # non-zero on success 
    assert retval 

    hicon, iicon, attr, display_name, type_name = info 

    # Get the bitmap 
    icon = wx.EmptyIcon() 
    icon.SetHandle(hicon) 
    return wx.BitmapFromIcon(icon) 

root = wx.App() 

bitmapFile = extension_to_bitmap(".png") 

bitmapFile.SaveFile('test.bmp', wx.BITMAP_TYPE_BMP) 

Любая помощь очень ценится!

ответ

0

Недавно я должен был сделать подобную задачу, и я использовал следующее (требует pywin32 и PIL или подушки). В принципе, вы получаете дескриптор значка и делаете копию. Это возвращает изображение PIL. Вы можете открыть Icontemp.bmp, используя что-то еще, если хотите.

def icon32(PATH): 
    SHGFI_ICON = 0x000000100 
    SHGFI_ICONLOCATION = 0x000001000 
    SHIL_EXTRALARGE = 0x00002 
    ret, info = shell.SHGetFileInfo(PATH, 0, SHGFI_ICONLOCATION | SHGFI_ICON | SHIL_EXTRALARGE) 
    hIcon, iIcon, dwAttr, name, typeName = info 
    tempDirectory = os.getenv("temp") 
    ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON) 
    #creating a destination memory DC 
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0)) 
    hbmp = win32ui.CreateBitmap() 
    hbmp.CreateCompatibleBitmap(hdc, ico_x, ico_x) 
    hdc = hdc.CreateCompatibleDC() 
    hdc.SelectObject(hbmp) 
    hdc.DrawIcon((0, 0), hIcon) 
    win32gui.DestroyIcon(hIcon) 
    hbmp.SaveBitmapFile(hdc, tempDirectory + "\Icontemp.bmp") 
    icon = QIcon(tempDirectory + "\Icontemp.bmp") 
    os.remove(tempDirectory + "\Icontemp.bmp") 
    return icon 
0

Как ни странно, Python, похоже, не так много для создания/редактирования * .ico-файлов. Похоже, ваш лучший выбор, чтобы получить привязки Python для ImageMagick:

Я не мог найти какую-либо документацию, относящуюся к привязок, хотя. Из того, что я прочитал, Python Imaging Library (PIL) может читать файлы значков, но не создавать их. Тем не менее, вы можете, вероятно, использовать PIL для создания растровых файлов: