我已经在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
这就是我的结果:
我已经读过QFileSystemWatcher
,它显然在特定的文件夹中进行监视,并通知该文件夹中是否发生了与文件相关的任何更改,但我不知道它是否也显示该文件中的数据。如果你们能帮助我获得理想的结果,我将不胜感激。
您确实可以使用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()