Skip to main content
 首页 » 编程设计

python之QTreeWidget 中的目录树

2025年05月04日7haluo1

我正在使用 zipfile和 tarfile用于打开、提取和压缩文件的 Python 模块。
我需要在 QTreeWidget 中显示存档结构,但我不知道如何进行。为了获取信息,我使用了来自 this file 的函数 infos(path) . 我想获得这样的东西(来自方舟):

例如,如果我收到此文件名:('GCI/PyFiles/prova3.py', 'GCI/', 'GCI/PyFiles/', 'GCI/Screenshots/', 'GCI/prova2.py' py', 'prova.py'),我想得到这个:

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

在我的 QTreeWidget 中。

谢谢, 魔方

请您参考如下方法:

我不确定 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', '']]