python + pyqt5 QTreeWidget 实现文件资源管理

这是VSCode的文件资源管理或者叫资源文件导航,这是一个树形结构的,我们使用 QTreeWidget来实现一下,最终的结果如下:

 

我先把代码贴出来,UI界面的编程,不可能把每一行代码都讲清楚,我只讲一些思路和需要注意的细节吧:

 第一个文件(fileopen.py),UI设计的文件,是QT Designer设计好的ui文件直接转换为的Python文件:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'fileopen.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        self.menufile = QtWidgets.QMenu(self.menubar)
        self.menufile.setObjectName("menufile")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionfileopen = QtWidgets.QAction(MainWindow)
        self.actionfileopen.setObjectName("actionfileopen")
        self.menufile.addAction(self.actionfileopen)
        self.menubar.addAction(self.menufile.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menufile.setTitle(_translate("MainWindow", "File"))
        self.actionfileopen.setText(_translate("MainWindow", "Open Folder..."))

 

第二个文件(file_tree.py), 逻辑文件,主要内容的实现,在这里:

import sys
from PyQt5.QtWidgets import *
from PyQt5 import Qt, QtGui
from filename import file_name as fn
from fileopen import Ui_MainWindow
from PyQt5 import QtWidgets
import threading
import os

class Tree(QMainWindow, Ui_MainWindow):
    def __init__(self, parent = None):
        super(Tree, self).__init__(parent)
        self.setupUi(self)
        self.setWindowTitle("File_Tree")
        self.actionfileopen.triggered.connect(self.Open_Folder)

    def Open_Folder(self):
        path = QFileDialog.getExistingDirectory(self, "选取文件夹", "./")
        self.tree = QTreeWidget()
        self.tree.setColumnCount(1)
        self.tree.setColumnWidth(0, 50)
        self.tree.setHeaderLabels(["EXPLORER"])
        self.tree.setIconSize(Qt.QSize(25, 25))
        self.tree.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.actionfileopen.triggered.connect(self.Open_Folder)

        dirs = fn(path)

        fileInfo = Qt.QFileInfo(path)
        fileIcon = Qt.QFileIconProvider()
        icon = QtGui.QIcon(fileIcon.icon(fileInfo))
        root = QTreeWidgetItem(self.tree)
        root.setText(0,path.split('/')[-1])
        root.setIcon(0,QtGui.QIcon(icon))
        self.CreateTree(dirs, root, path)
        self.setCentralWidget(self.tree)
        QApplication.processEvents()

    def CreateTree(self, dirs, root, path):
        for i in dirs:
            path_new = path + '\\' + i
            if os.path.isdir(path_new):
                fileInfo = Qt.QFileInfo(path_new)
                fileIcon = Qt.QFileIconProvider()
                icon = QtGui.QIcon(fileIcon.icon(fileInfo))
                child = QTreeWidgetItem(root)
                child.setText(0,i)
                child.setIcon(0,QtGui.QIcon(icon))
                dirs_new = fn(path_new)
                self.CreateTree(dirs_new, child, path_new)
            else:
                fileInfo = Qt.QFileInfo(path_new)
                fileIcon = Qt.QFileIconProvider()
                icon = QtGui.QIcon(fileIcon.icon(fileInfo))
                child = QTreeWidgetItem(root)
                child.setText(0,i)
                child.setIcon(0,QtGui.QIcon(icon))


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Tree()
    win.show()
    sys.exit(app.exec_())

 

第三个文件(filename.py)我用于测试的文件,但是其中 file_name函数用于读取目录下的文件名,要使用到:

import os

def file_name(path):
    return os.listdir(path)

if __name__ == "__main__":
    path = 'C:\\Users\\...\\Desktop\\SeeTheData'
    dirs = file_name(path)
    for i in dirs:
        print(i)

 菜单选项的事件函数如下:

def Open_Folder(self):
        path = QFileDialog.getExistingDirectory(self, "选取文件夹", "./")
        self.tree = QTreeWidget()
        self.tree.setColumnCount(1)
        self.tree.setColumnWidth(0, 50)
        self.tree.setHeaderLabels(["EXPLORER"])
        self.tree.setIconSize(Qt.QSize(25, 25))
        self.tree.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.actionfileopen.triggered.connect(self.Open_Folder)

        dirs = fn(path)

        fileInfo = Qt.QFileInfo(path)
        fileIcon = Qt.QFileIconProvider()
        icon = QtGui.QIcon(fileIcon.icon(fileInfo))
        root = QTreeWidgetItem(self.tree)
        root.setText(0,path.split('/')[-1])
        root.setIcon(0,QtGui.QIcon(icon))
        self.CreateTree(dirs, root, path)
        self.setCentralWidget(self.tree)
        QApplication.processEvents()

 生成文件选择对话框,并获得目录路径:

path = QFileDialog.getExistingDirectory(self, "选取文件夹", "./")

 创建QTreeWidget组件,并设置相关参数:

self.tree = QTreeWidget()
self.tree.setColumnCount(1)
self.tree.setColumnWidth(0, 50)
self.tree.setHeaderLabels(["EXPLORER"])
self.tree.setIconSize(Qt.QSize(25, 25))
self.tree.setSelectionMode(QAbstractItemView.ExtendedSelection)

获取文件在系统下的图标:

fileInfo = Qt.QFileInfo(path)
fileIcon = Qt.QFileIconProvider()
icon = QtGui.QIcon(fileIcon.icon(fileInfo))

创建根节点:

root = QTreeWidgetItem(self.tree)
root.setText(0,path.split('/')[-1])
root.setIcon(0,QtGui.QIcon(icon))

递归创建子节点的函数如下:

    def CreateTree(self, dirs, root, path):
        for i in dirs:
            path_new = path + '\\' + i
            if os.path.isdir(path_new):
                fileInfo = Qt.QFileInfo(path_new)
                fileIcon = Qt.QFileIconProvider()
                icon = QtGui.QIcon(fileIcon.icon(fileInfo))
                child = QTreeWidgetItem(root)
                child.setText(0,i)
                child.setIcon(0,QtGui.QIcon(icon))
                dirs_new = fn(path_new)
                self.CreateTree(dirs_new, child, path_new)
            else:
                fileInfo = Qt.QFileInfo(path_new)
                fileIcon = Qt.QFileIconProvider()
                icon = QtGui.QIcon(fileIcon.icon(fileInfo))
                child = QTreeWidgetItem(root)
                child.setText(0,i)
                child.setIcon(0,QtGui.QIcon(icon))

 os.path.isdir用于判断路径是文件还是文件夹。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫虫(——)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值