如何用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
相关产品推荐
相关产品推荐

