Дерево каталогов в QTreeWidget - PullRequest
2 голосов
/ 05 января 2011

Я использую zipfile и tarfile Модули Python для открытия, извлечения и сжатия архивов.
Мне нужно отобразить структуру архива в QTreeWidget, и я нене знаю, как идти дальше.Для получения информации я использую функцию infos(path) из этого файла .Я хотел бы получить что-то вроде этого (от Арка):
alt text

Например, если я получу это имя файла: ('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py', 'prova.py'), я хотел бы получить это:

- prova.py
- GCI/
    |
    |- prova2.py
    |- PyFiles/
             |- prova3.py
    |- Screenshots/

в моем QTreeWidget.

Спасибо, rubik

1 Ответ

1 голос
/ 05 января 2011

Я не уверен, как QTreeWidget хочет, чтобы данные были несанкционированными, но вот (возможно, плохой способ) построить структуру в памяти.

x = ('GCI/PyFiles/prova3.py', 'GCI/', \
     'GCI/PyFiles/', 'GCI/Screenshots/', \
     'GCI/prova2.py', 'prova.py')

structure = {}
for fn in x:
    path = fn.split('/')

    tmpd = structure
    for p in path[:-1]:
        try:
            tmpd = tmpd[p]
        except KeyError:
            tmpd = tmpd[p] = {}

    tmpd[path[-1]] = None

Это даст вам словарь structure, которыйдля каждого ключа есть либо другой словарь (представляющий папку), либо None, представляющий, что ключ является файлом.

Лучший способ сделать это - создать класс, подобный этому:

class Node(object):
    def __init__(self):
        self.dirs = {}
        self.files = []

или что-то в этом роде.Если я правильно помню из моих дней программирования на QT, QTreeWidget хочет источник данных, чтобы вы в основном могли выяснить, как выглядит этот источник, и заполнить его соответствующим образом.Также возможно сделать это,

[sp for _,sp in sorted(
         (len(splitpath),splitpath) for splitpath in
            (path.split('/') for path in x)
         )
    ]

, который вернет вас:

[['prova.py'], ['GCI', ''], ['GCI', 'prova2.py'], 
 ['GCI', 'PyFiles', ''], ['GCI', 'PyFiles', 'prova3.py'], 
 ['GCI', 'Screenshots', '']]
...