Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MIME-type & icons 
:(
    Опции темы
DarkTroll
Дата 7.5.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.5.2010

Репутация: нет
Всего: нет



Здравствуйте. 
Я решил написать интереса ради файл-менеджер на PyQt. Для отображения содержимого каталогов выбрал QListWidget. Все бы хорошо, да не могу написать эффективный алгоритм ассоциации определенному типу файлов определенной иконки. 
Процесс я представляю так:
1. Получаю список файлов в директории средствами модуля os
2. Создаю цикл for и в нем:
    a) Для каждого элемента списка определяю его MIME-тип
    b) По MIME-типу определяю иконку и назначаю ее соответствующему файлу.

Но все это ОЧЕНЬ медленно работает при большом количестве файлов в каком-либо каталоге. Например, для отображения содержимого /usr/bin (около 2,5 тысяч файлов) уходит 16 секунд, а если без определения типа файла, то меньше секунды. Причем тормозит не отрисовка элементов компонента QListWidget, а именно определение MIME-типа.

Подскажите пожалуйста, где можно упростить, оптимизировать мой корявый код или подскажите, как можно иначе реализовать ассоциацию иконки файлу?

Вот листинги соответствующих функций:

list_print: функция, отображающая содержимое каталога:
Код

def list_print(self, path_): # функция, отображающая содержимое каталога
    items_ = pyfileman.sorted_list(path_) # список, содержащий упорядоченный перечень имен файлов в директории, указанной в переменной path_
    for j in items_: # создаю цикл для перебора списка
        mime_ = mime.get_mime(j) #определяю тип файла
        mime_icon_path = mime.get_mime_icon(mime_, os.getcwd(), j) # указываю путь к иконке, соответствующей этому типу
        icon = QtGui.QIcon(mime_icon_path) # создаю иконку
        i = QtGui.QListWidgetItem(icon, j, self.listwidget) # создаю элемент списка с иконкой и именем файла
        self.listwidget.addItem(i) # добавляю его в QListWidget.


get_mime: функция, определяющая MIME-тип:
Код

import mimetypes 
def get_mime(file): #Функция, определяющая MIME-тип файла, путь к которому указан в переменной file
    mimetypes.init()
    ext = u'.%s' % file.split('.')[-1]
    try:
        mime = mimetypes.types_map[ext]
    except:
        mime = False
    return mime

get_mime_icon: функция, назначающая иконку файлу
Код

def get_mime_icon(mime, path): # функция, назначающая иконку файлу. mime - MIME-тип, path - путь к файлу
    mimetype = str(mime)
    if mimetype == 'application/pdf': #если тип PDF 
        return '/.media/mime_icons/pdf.png' # то возвращаем путь к соответствующей иконке
    elif mimetype.startswith('image'):
        return '/.media/mime_icons/image.png'
    elif mimetype.startswith('audio'):
        return '/.media/mime_icons/audio-x-generic.png'
    elif mimetype.find('application/x-font-ttf') != -1:
        return '/.media/mime_icons/font_truetype.png'
        .......
        .......
    else:
        return '/.media/mime_icons/unknown.png'


PM MAIL   Вверх
Amp
Дата 7.5.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 2
Всего: 17



Определять mime-type только для видимых айтемов у ListWidget + некоторый запас. mime-type-ы в процессе скроллинга запоминать и кэшировать. Вроде krusader так и делает.

Это сообщение отредактировал(а) Amp - 7.5.2010, 17:23
PM MAIL   Вверх
DarkTroll
Дата 7.5.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.5.2010

Репутация: нет
Всего: нет



Amp, идея, кстати, интересная! Попробую так сделать позже, это должно еще ускорить отрисовку. Но решение моей проблемы (очень простое) в другом: я при каждом обращении к функции get_mime вызывал mimetypes.init(). Именно поэтому все и тормозило. Устранил - теперь все летает так же быстро как и без иконок! 
PM MAIL   Вверх
andreyVL
Дата 8.5.2010, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.5.2009

Репутация: нет
Всего: нет



DarkTroll, поделись скриптом гюи

уже не надо.

Это сообщение отредактировал(а) andreyVL - 9.5.2010, 09:46
PM MAIL   Вверх
DarkTroll
Дата 13.5.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.5.2010

Репутация: нет
Всего: нет



andreyVL, что ты имеешь ввиду?
PM MAIL   Вверх
andreyVL
Дата 13.5.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.5.2009

Репутация: нет
Всего: нет



отбой тревоги. уже сделал

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  pic1.jpg 76,66 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Разработка GUI | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.