QTreeWidget中的目录树
我正在使用 zipfile 和 tarfile 这两个Python模块来打开、提取和压缩文件包。
我需要在一个QTreeWidget中显示文件包的结构,但我不知道该怎么做。为了获取信息,我使用了来自 这个文件 的 infos(path)
函数。
我想得到类似于这个(来自Ark)的结构:
举个例子,如果我收到这些文件名: ('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py', 'prova.py')
,我希望在我的QTreeWidget中得到这样的结果:
- prova.py
- GCI/
|
|- prova2.py
|- PyFiles/
|- prova3.py
|- Screenshots/
谢谢,
rubik
1 个回答
1
我不太确定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', '']]