You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python与PyQt5将目录文件普通列表转换为树形列表

用PyQt5实现树形目录展示(替代扁平列表)

嗨,我明白你想把原来用QListWidget展示的扁平文件列表改成层级化的树形结构——这在PyQt5里用QTreeWidget就能轻松搞定,它天生支持节点的层级嵌套,完美适配目录结构的展示需求。下面是完整的可运行代码,包含文件夹选择、递归构建树形节点的逻辑:

完整实现代码

import os
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTreeWidget, 
                             QTreeWidgetItem, QPushButton, QVBoxLayout, QWidget,
                             QFileDialog)
from PyQt5.QtGui import QIcon

class DirectoryTreeWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("树形目录浏览器")
        self.setGeometry(100, 100, 600, 400)
        
        # 创建主部件和布局
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        # 创建选择文件夹按钮
        self.select_btn = QPushButton("选择目标文件夹")
        self.select_btn.clicked.connect(self.select_directory)
        layout.addWidget(self.select_btn)
        
        # 创建树形部件
        self.tree_widget = QTreeWidget()
        self.tree_widget.setColumnCount(1)  # 设置只显示一列(文件名/文件夹名)
        self.tree_widget.setHeaderLabel("目录结构")
        layout.addWidget(self.tree_widget)
        
        # 用于获取系统图标(可选,让界面更直观)
        self.icon_provider = QFileDialog()

    def select_directory(self):
        # 弹出文件夹选择对话框
        dir_path = QFileDialog.getExistingDirectory(self, "选择目标文件夹", os.path.expanduser("~"))
        if not dir_path:
            return
        
        # 清空现有树形结构
        self.tree_widget.clear()
        
        # 递归构建树形节点
        self.build_tree(dir_path, self.tree_widget.invisibleRootItem())

    def build_tree(self, current_path, parent_item):
        # 遍历当前路径下的所有文件和文件夹
        for entry in os.scandir(current_path):
            # 创建树形节点
            item = QTreeWidgetItem(parent_item, [entry.name])
            
            # 设置图标:文件夹用系统文件夹图标,文件用系统文件图标
            if entry.is_dir():
                icon = self.icon_provider.icon(QFileDialog.Directory)
                item.setIcon(0, icon)
                # 递归处理子文件夹
                self.build_tree(entry.path, item)
            else:
                icon = self.icon_provider.icon(QFileDialog.File)
                item.setIcon(0, icon)

if __name__ == "__main__":
    app = QApplication([])
    window = DirectoryTreeWindow()
    window.show()
    app.exec_()

关键部分说明

  • 替换控件:用QTreeWidget替代原来的QListWidget,它支持节点的层级嵌套,每个节点可以有子节点,完美匹配目录的层级关系。
  • 递归遍历:build_tree函数是核心,它会递归遍历每个文件夹,为每个文件夹和文件创建对应的树形节点,并将子文件夹的节点挂载到父文件夹节点下。
  • 图标优化:通过QFileDialog的icon方法获取系统默认的文件夹和文件图标,让树形结构更符合用户的视觉习惯(这一步是可选的,如果你不需要图标可以去掉)。
  • 文件夹选择:点击按钮后用QFileDialog.getExistingDirectory获取用户选择的文件夹路径,然后清空现有树形结构,重新构建新的目录树。

运行这个程序后,你选择目标文件夹,就能看到和你需求一致的树形展示效果:folder1 下面包含 subfolder1、file1、file2;folder2 下面包含 subfolder1(里面有file1、file2、file3)、subfolder2(里面有file1)等层级结构。

内容的提问来源于stack exchange,提问作者Pyt Leb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:52:08