Python----PyQt开发(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, QtWidgetsclass 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.translateForm.setWindowTitle(_translate("Form", "文件浏览器"))self.back_btn.setText(_translate("Form", "返回"))
三、 信号与槽连接
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() # 更新目录展示
四、用到的库函数
QDir
setPath() 设置路径
entryInfoList() 获取当前目录下所有文件夹以及文件信息,返回一个列表
cd() 切换目录
cdUp() 返回上一级目录
absolutePath() 获取当前目录的绝对路径
QListWidget
addItem() 添加单元项
clear() 清空列表
itemDoubleClicked() 单元项双击信号
QListWidgetItem
setText() 设置文本
setIcon() 设置图标
text() 获取文本内容
QFileInfoList
at() 访问元素
QFileInfo
fileName() 获取文件名
isDir() 判断是不是文件夹
isFile() 判断是不是文件
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_()) # 运行应用程序并在退出时关闭