PyQt5从入门到精通系列-09-关于文件监听QFileSystemWatcher

PyQt5从入门到实践系列-01-配置安装

PyQt5从入门到实践系列-02-布局(数据展示GUI小项目)

PyQt5从入门到实践系列-03-QTableWidget(选取表单数据绘图)

PyQt5从入门到实践系列-04-数据可视化(PyQtChart)

PyQt5从入门到实践系列-05-数据可视化(GUI中Matplotlib)

PyQt5从入门到实践系列-06-QtreeWidget树形控件

PyQt5从入门到精通系列-07-信号与槽详解

PyQt5从入门到精通系列-08-文件

上期,我们已经介绍了基于PyQt5常用的文件操作,本期,我们介绍QFileSystemWatcher文件目录监听类。QFileSystemWatcher把一些目录或文件添加到监听列表后,当目录或文件发生修改、删除等变化时会发射信号,从而实现对目录和文件的监听。基本函数及操作如下:

 

附上完整小项目案例代码

第一部分:ui文件代码


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")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Agency FB")
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 1, 0, 1, 1)
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setObjectName("textEdit")
        self.gridLayout_2.addWidget(self.textEdit, 1, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "监听文件:"))
        self.pushButton_2.setText(_translate("MainWindow", "监听目录:"))

 第二部分:主逻辑代码

import os
import sys

import qdarkstyle
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import (QFileSystemWatcher,QDir,QTimer)
from PyQt5.QtWidgets import QFileDialog
from watchdog import Ui_MainWindow


class QmyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.file_name = ""
        self.select_path = ""

        self.timer = QTimer(self)
        self.timer.setInterval(500)
        self.timer.timeout.connect(self.handle_timer)
        self.timer.start(1000)

        self.fileWatcher = QFileSystemWatcher()
        self.ui.pushButton.clicked.connect(self.open_file)
        self.ui.pushButton_2.clicked.connect(self.open_dirs)

        self.fileWatcher.fileChanged.connect(self.do_fileChanged)
        self.fileWatcher.directoryChanged.connect(self.do_directoryChanged)
        self.processed_files = set()

    def do_directoryChanged(self,path):
        file_name = path.split('/')[-1]
        if file_name not in self.processed_files:
            self.processed_files.add(file_name)

    def handle_timer(self):
        for file_name in QDir(self.select_path).entryList():
            if file_name not in self.processed_files:
                self.ui.textEdit.append("New file added:"+ os.path.join(self.select_path,file_name))
                self.processed_files.add(file_name)

    def do_fileChanged(self):
        self.ui.textEdit.append(os.path.join(self.file_name)+"文件发生了改变")

    def open_file(self):
        curr_path = QDir.currentPath()
        self.file_name, ok = QFileDialog.getOpenFileName(self, "打开文件", curr_path, "所有文件(*.*)")
        self.ui.lineEdit.setText(self.file_name)
        self.ui.textEdit.append(self.file_name)
        self.fileWatcher.addPath(self.file_name)

    def open_dirs(self):
        curr_path = QDir.currentPath()
        self.select_path = QFileDialog.getExistingDirectory(self, "选择一个目录",
                                                curr_path, QFileDialog.ShowDirsOnly)
        self.ui.lineEdit_2.setText(self.select_path)
        self.ui.textEdit.append(self.select_path)
        self.fileWatcher.addPath(self.select_path)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = QmyMainWindow()
    form.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    form.show()
    sys.exit(app.exec_())

 

本小节,重点介绍pyqt5中的QFileSystemWatcher,实现监听文件目录,当目录中新增文件或目录时显示新增文件或目录的完整路径,代码粗糙,仅提供参考。PyQt5中的文件监听使用不太方便,下期我们聊一聊实用的文件和目录实时监听框架的使用及实践案例。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值