监视文件夹中最近添加的文件,并在QTableView上显示该文件中的数据

问题描述 投票:0回答:1

我已经在PyQt5中编写了逻辑,可以读取最近的csv文件中的数据,当您按下按钮时,该文件已添加到特定文件夹中。我也想删除按下按钮的功能。因此,一旦在该文件夹中添加了一个新的csv文件,该csv文件中的内容应自动显示在TableView中。这是我正在使用的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
import numpy as np
import pandas as pd
import glob
import os
import csv
from itertools import combinations

class DataFrameModel(QtCore.QAbstractTableModel):
    DtypeRole = QtCore.Qt.UserRole + 1000
    ValueRole = QtCore.Qt.UserRole + 1001

    def __init__(self, df=pd.DataFrame(), parent=None):
        super(DataFrameModel, self).__init__(parent)
        self._dataframe = df

    def setDataFrame(self, dataframe):
        self.beginResetModel()
        self._dataframe = dataframe.copy()
        self.endResetModel()

    def dataFrame(self):
        return self._dataframe

    dataFrame = QtCore.pyqtProperty(pd.DataFrame, fget=dataFrame, fset=setDataFrame)

    @QtCore.pyqtSlot(int, QtCore.Qt.Orientation, result=str)
    def headerData(self, section: int, orientation: QtCore.Qt.Orientation, role: int = QtCore.Qt.DisplayRole):
        if role == QtCore.Qt.DisplayRole:
            if orientation == QtCore.Qt.Horizontal:
                return self._dataframe.columns[section]
            else:
                return str(self._dataframe.index[section])
        return QtCore.QVariant()

    def rowCount(self, parent=QtCore.QModelIndex()):
        if parent.isValid():
            return 0
        return len(self._dataframe.index)

    def columnCount(self, parent=QtCore.QModelIndex()):
        if parent.isValid():
            return 0
        return self._dataframe.columns.size

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if not index.isValid() or not (0 <= index.row() < self.rowCount() \
            and 0 <= index.column() < self.columnCount()):
            return QtCore.QVariant()
        row = self._dataframe.index[index.row()]
        col = self._dataframe.columns[index.column()]
        dt = self._dataframe[col].dtype

        val = self._dataframe.iloc[row][col]
        if role == QtCore.Qt.DisplayRole:
            return str(val)
        elif role == DataFrameModel.ValueRole:
            return val
        if role == DataFrameModel.DtypeRole:
            return dt
        return QtCore.QVariant()

    def roleNames(self):
        roles = {
            QtCore.Qt.DisplayRole: b'display',
            DataFrameModel.DtypeRole: b'dtype',
            DataFrameModel.ValueRole: b'value'
        }
        return roles


class Ui_Rulepriority(object):
    def setupUi(self, Rulepriority):
        Rulepriority.setObjectName("Rulepriority")
        Rulepriority.resize(820, 480)
        self.verticalLayout = QtWidgets.QVBoxLayout(Rulepriority)
        self.verticalLayout.setObjectName("verticalLayout")
        self.OpenCsv = QtWidgets.QPushButton(Rulepriority)
        self.OpenCsv.setObjectName("OpenCsv")
        self.verticalLayout.addWidget(self.OpenCsv)
        self.OpenCsv.clicked.connect(self.file_open)
        self.tableView = QtWidgets.QTableView(Rulepriority)
        self.tableView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
        self.tableView.setObjectName("tableView")
        self.verticalLayout.addWidget(self.tableView)

        self.retranslateUi(Rulepriority)
        self.OpenCsv.clicked.connect(self.tableView.show)
        QtCore.QMetaObject.connectSlotsByName(Rulepriority)

    def retranslateUi(self, Rulepriority):
        _translate = QtCore.QCoreApplication.translate
        Rulepriority.setWindowTitle(_translate("Rulepriority", "Error App"))
        self.OpenCsv.setText(_translate("Rulepriority", "Get recent data"))
        Rulepriority.setWindowIcon(QtGui.QIcon('favicon.ico'))

    def file_open(self):
        list_of_files = glob.glob('Folder for violation csv/Violations_*.csv')
        latest_file = max(list_of_files, key=os.path.getctime)

        df1 = pd.read_csv(latest_file)

        model = DataFrameModel(df1)
        self.tableView.setModel(model)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Rulepriority = QtWidgets.QDialog()
    ui = Ui_Rulepriority()
    ui.setupUi(Rulepriority)
    Rulepriority.show()
    sys.exit(app.exec_())

我从这个答案class DataFrameModel中借了How to display a Pandas data frame with PyQt5/PySide2

这就是我的结果:

enter image description here

我已经读过QFileSystemWatcher,它显然在特定的文件夹中进行监视,并通知该文件夹中是否发生了与文件相关的任何更改,但我不知道它是否也显示该文件中的数据。如果你们能帮助我获得理想的结果,我将不胜感激。

python pyqt pyqt5
1个回答
0
投票

您确实可以使用QFileSystemWatcher对象来监视目录。修改此目录后自动更新表格,例如添加或修改文件后,您可以将信号QFileSystemWatcher.directoryChanged连接到Ui_Rulepriority.file_open,例如

class Ui_Rulepriority(object):
    def setupUi(self, Rulepriority):
        ....
        self.watcher = QtCore.QFileSystemWatcher(['Folder for violation csv'])
        self.watcher.directoryChanged.connect(self.file_open)
        self.file_open()
© www.soinside.com 2019 - 2024. All rights reserved.