使用Python和PyQt打造自定义文件浏览器

171

在现代软件开发中,图形用户界面(GUI)的应用程序越来越受到开发者的青睐。Python作为一种高效、易学的编程语言,结合PyQt这一强大的GUI库,使得开发者能够快速构建出功能丰富、界面友好的应用程序。本文将介绍如何使用Python和PyQt打造一个自定义的文件浏览器,帮助用户更方便地管理和浏览文件。

一、效果展示

使用Python和PyQt打造自定义文件浏览器

二、界面设计 

该界面通过Qt Designer设计

# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'file_web.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
 
 
from PyQt5 import QtCore, QtGui, QtWidgets
 
 
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(565, 459)
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 551, 441))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.back_btn = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.back_btn.setMinimumSize(QtCore.QSize(40, 40))
        font = QtGui.QFont()
        font.setPointSize(15)
        self.back_btn.setFont(font)
        self.back_btn.setObjectName("back_btn")
        self.horizontalLayout.addWidget(self.back_btn)
        self.lineEdit = QtWidgets.QLineEdit(self.verticalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(15)
        self.lineEdit.setFont(font)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.listWidget = QtWidgets.QListWidget(self.verticalLayoutWidget)
        self.listWidget.setObjectName("listWidget")
        self.verticalLayout.addWidget(self.listWidget)
 
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
 
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "文件浏览器"))
        self.back_btn.setText(_translate("Form", "返回"))

使用Python和PyQt打造自定义文件浏览器

三、 信号与槽连接

3.1、得到当前的目录路径

def show_dir(self):
    # 显示当前目录内容的函数
    self.listWidget.clear()  # 清空列表
    self.dir.setPath(self.lineEdit.text())  # 设置QDir对象的路径为文本框中的路径
    Dir_filter = QDir.AllEntries | QDir.NoDotAndDotDot  # 过滤条件:所有条目,不包括.和..
    sort_filter = QDir.DirsFirst  # 排序条件:文件夹优先
 
    self.list_list = self.dir.entryInfoList(Dir_filter, sort_filter)  # 获取目录列表
    for i in self.list_list:  # 遍历目录列表
        item = QListWidgetItem()  # 创建新的列表项
        # 根据条目类型设置图标
        if i.isDir():
            item.setIcon(QIcon('../菜单/images/icon/dir.png'))  # 设置目录图标
        elif i.isFile():
            item.setIcon(QIcon('../菜单/images/icon/file.png'))  # 设置文件图标
        item.setText(i.fileName())  # 设置列表项的文本为文件或目录名
        self.listWidget.addItem(item)  # 将项添加到列表中

3.2、 选择目录中的选项双击

def btn_btn(self, item):
    # 双击列表项的槽函数
    result = self.dir.cd(item.text())  # 进入选中的目录
    print(result)  # 打印进入结果
    if result:  # 如果成功进入目录
        path = self.dir.absolutePath()  # 获取当前目录的绝对路径
        self.lineEdit.setText(path)  # 更新路径文本框
        self.show_dir()  # 更新目录展示
    else:  # 如果不是目录,尝试打开文件
        filepath = self.dir.absolutePath() + '/' + item.text()  # 构造文件路径
        # print(filepath)
        self.progess = QProcess(self)  # 创建QProcess对象用于启动子进程
        argv = []  # 存储进程的参数
        argv.append("notepad.py")  # 添加要执行的脚本
        argv.append(filepath)  # 添加文件路径作为参数
        self.progess.start('python', argv)  # 启动python进程

3.3、 返回上层目录

def back_slot(self):
    # 返回上层目录的槽函数
    result = self.dir.cdUp()  # 尝试进入上层目录
    if result:  # 如果成功
        path = self.dir.absolutePath()  # 获取当前目录的绝对路径
        print(path)  # 打印路径
        self.lineEdit.setText(path)  # 更新文本框中的路径
        self.show_dir()  # 更新目录展示

四、用到的库函数 

1.QDir      

  • setPath()        设置路径

  • entryInfoList() 获取当前目录下所有文件夹以及文件信息,返回一个列表

  • cd()        切换目录

  • cdUp()        返回上一级目录

  • absolutePath()        获取当前目录的绝对路径

2.QListWidget

  • addItem()        添加单元项

  • clear()        清空列表

  • itemDoubleClicked()        单元项双击信号

3.QListWidgetItem

  • setText()        设置文本

  • setIcon()        设置图标

  • text()        获取文本内容

4.QFileInfoList

at()        访问元素

5.QFileInfo

  • fileName()        获取文件名

  • isDir()        判断是不是文件夹

  • isFile()        判断是不是文件

6.QProcess

start()        启动进程

五、完整代码

import sys
from PyQt5.QtGui import QIcon
from file_web import Ui_Form  # 导入生成的UI类
from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QListWidgetItem  # 导入所需的Qt组件
from PyQt5.QtCore import QDir, QProcess  # 导入目录和进程相关的类
 
 
class fileWidge(QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)  # 设置UI界面
 
        self.lineEdit.setText('./')  # 设置初始路径为当前目录
 
        self.dir = QDir()  # 创建QDir对象以处理目录
        self.show_dir()  # 显示当前目录的内容
 
        self.slot_init()  # 初始化信号和槽连接
 
    def slot_init(self):
        # 连接按钮和列表项的信号到相应的槽函数
        self.back_btn.clicked.connect(self.back_slot)  # 返回上级目录按钮
        self.listWidget.itemDoubleClicked.connect(self.btn_btn)  # 双击列表项打开
 
    def back_slot(self):
        # 返回上层目录的槽函数
        result = self.dir.cdUp()  # 尝试进入上层目录
        if result:  # 如果成功
            path = self.dir.absolutePath()  # 获取当前目录的绝对路径
            print(path)  # 打印路径
            self.lineEdit.setText(path)  # 更新文本框中的路径
            self.show_dir()  # 更新目录展示
 
    def btn_btn(self, item):
        # 双击列表项的槽函数
        result = self.dir.cd(item.text())  # 进入选中的目录
        print(result)  # 打印进入结果
        if result:  # 如果成功进入目录
            path = self.dir.absolutePath()  # 获取当前目录的绝对路径
            self.lineEdit.setText(path)  # 更新路径文本框
            self.show_dir()  # 更新目录展示
        else:  # 如果不是目录,尝试打开文件
            filepath = self.dir.absolutePath() + '/' + item.text()  # 构造文件路径
            # print(filepath)
            self.progess = QProcess(self)  # 创建QProcess对象用于启动子进程
            argv = []  # 存储进程的参数
            argv.append("notepad.py")  # 添加要执行的脚本
            argv.append(filepath)  # 添加文件路径作为参数
            self.progess.start('python', argv)  # 启动python进程
 
    def show_dir(self):
        # 显示当前目录内容的函数
        self.listWidget.clear()  # 清空列表
        self.dir.setPath(self.lineEdit.text())  # 设置QDir对象的路径为文本框中的路径
        Dir_filter = QDir.AllEntries | QDir.NoDotAndDotDot  # 过滤条件:所有条目,不包括.和..
        sort_filter = QDir.DirsFirst  # 排序条件:文件夹优先
 
        self.list_list = self.dir.entryInfoList(Dir_filter, sort_filter)  # 获取目录列表
        for i in self.list_list:  # 遍历目录列表
            item = QListWidgetItem()  # 创建新的列表项
            # 根据条目类型设置图标
            if i.isDir():
                item.setIcon(QIcon('../菜单/images/icon/dir.png'))  # 设置目录图标
            elif i.isFile():
                item.setIcon(QIcon('../菜单/images/icon/file.png'))  # 设置文件图标
            item.setText(i.fileName())  # 设置列表项的文本为文件或目录名
            self.listWidget.addItem(item)  # 将项添加到列表中
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)  # 创建应用程序实例
    windows = fileWidge()  # 创建主窗口实例
 
    windows.show()  # 显示主窗口
    sys.exit(app.exec_())  # 运行应用程序并在退出时关闭

总结

通过本文的介绍,我们成功使用Python和PyQt打造了一个自定义的文件浏览器。这个文件浏览器不仅具备基本的文件浏览功能,还可以根据用户需求进行扩展和定制。Python和PyQt的强大功能和灵活性,使得开发者能够快速构建出功能丰富、界面友好的应用程序。希望本文的介绍对您有所帮助,激发您在Python和PyQt领域的探索和创新。

Python PyQt 文件浏览器
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

深入解析Python图像处理中的内存泄漏问题及解决方案
随着计算机视觉和图像处理技术的不断发展,Python作为一种高效、简洁的编程语言,逐渐成为图像处理领域的首选工具。然而,在实际开发过程中,内存泄漏问题常常困扰着开发者,...
2025-02-18 编程技术
164

使用Python实现音乐播放器的示例代码
本文将向大家介绍一个使用Python实现的简易音乐播放器示例代码,通过结合tkinter图形用户界面库与pygame音乐处理库,我们将亲手打造一个功能完备、操作简便的音乐播放工具。无...
2025-02-18 编程技术
159

使用Python和PyQt6开发图片播放器(附示例代码)
随着计算机技术的飞速发展,图形用户界面(GUI)的应用程序越来越受到人们的青睐。Python作为一种高效、简洁的编程语言,结合PyQt6库,可以轻松创建功能强大的GUI应用程序。本...
2025-02-18 编程技术
153

Python在Word文档中插入图片的三种方法解析
手动在Word中插入图片往往耗时且易出错,特别是在需要批量处理或精确控制图片位置和格式时。因此,利用编程语言如Python来自动化这一过程,不仅可以大大提高效率,还能确保文...
2025-02-14 编程技术
178

Python+OpenCV实现图片去水印的多种方法详解
在数字图像处理领域,去除图片上的水印是一个常见的需求。无论是个人用户还是企业,在使用或处理图片时,都可能遇到需要去除水印的情况。然而,由于水印的形式多样,去除水印...
2025-02-14 编程技术
176

Python脚本实战:轻松拆分PDF文件
在处理大量PDF文件时,我们有时会遇到需要拆分文件的情况,比如提取其中的某些页面进行单独保存或分享。这时,一款高效、易用的PDF拆分工具就显得尤为重要。本文将介绍一款基...
2025-02-13 编程技术
182