python - 如何使用 Pyqt5 TableWidget ItemChange 将更改保存到 .csv?
问题描述
我有一个包含 ['Project_ID'、'Event_ID'、'Event_name'、'Start_Date'、'End_Date'] 列的数据表。我将此数据表加载到 QTableWidget,但没有 ID(仅用于后端)。一个项目可以有多个事件,所以在这张表中有很多重复的“Project_ID”,但所有的“Event_ID”都是唯一的。
用户旅程:用户单击一个项目,它会打开一个新窗口(传递 Project_ID),其中 QTableWidget 位于中心,并从 .csv 加载数据。用户可以查看/添加/删除/修改事件。
我使用 ItemChange() 信号和 pandas .loc[] 将用户更改保存在 .csv 文件中。但是我不知道如何在 .csv 文件中找到该行。我只知道“Project_ID”,在这个信号中,Event_name 是新名称,所以我无法获取旧变量来定位我在数据表中的行。
注意:我希望用户能够修改所有三列,并保存更改。
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
uic.loadUi('demo.ui',self)
self.located_ID = "455346ab-134d-4ab5-81ad-3ed4b365a8b8" #This comes from the Main Form
self.tableWidget.itemChanged.connect(self.save_changes)
self.projekt_events = pd.read_csv('Adatok/esemenyek.csv',sep=';',encoding='utf-8')
self.projekt_events = self.projekt_events.loc[self.projekt_events['UUID_Projekt']==self.located_ID] #I kknow this ID from the main Form
tableWidgetItems = pd.DataFrame(self.projekt_events,columns=['ESEMENY','KEZDO_DATE','VEGE_DATE'])
# Adding data to table
data = tableWidgetItems.values.tolist()
numrows = len(data)
self.tableWidget.setRowCount(numrows)
for row in range(numrows):
for column in range(2):
if isinstance(data[row][column], int):
self.tableWidget.setItem(row,column, QTableWidgetItem((str(data[row][column]))))
else:
self.tableWidget.setItem(row, column, QTableWidgetItem((data[row][column])))
self.show()
@pyqtSlot()
def save_changes(self):
# Dataframe columns = ['Project_ID','Event_ID','Event_name','Start_Date','End_Date']
#"How do i save First, Second and Third column changes to this csv file<
for currentQTableWidgetItem in self.tableWidget_pdw.selectedItems():
self.projekt_events.loc[(self.projekt_events['Project_ID']==self.located_ID)&(self.projekt_events['Event_ID']=="?????"),column] = currentQTableWidgetItem.text()
self.projekt_events.to_csv('Adatok/esemenyek.csv',index=False, encoding='utf-8',sep=';')
def main():
app = QApplication(sys.argv)
ex = MainWindow()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
解决方案
也许这会有所帮助,它会读取整个
for row in range(self.tableWidget.rowCount()):
rowdata = []
for column in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(row, column)
if item is not None:
rowdata.append(item.text())
else:
rowdata.append('')
推荐阅读
- python - pyinstaller 无法构建可执行文件
- mysql - 如何阻止我的日期选择一个额外的日期?
- python - 给定总体和子集,如何创建所有组合的列表?(nCr)
- python - 如何使用正则表达式将单词列表与另一个单词列表进行比较并打印匹配项?
- python - 如何将 Django 模型迁移到具有表继承的模型中
- excel - 我得到的错误是 'If lineod<>"" then' 行上的不匹配类型
- wordpress - 禁用 Wordpress 重定向
- mongodb - 在 MACOS 上本地运行的 MongoDB Auth 错误
- elasticsearch - 使用 Flask 进行弹性搜索的 GET 方法
- python - Pandas 用相同形状的空值数组填充不知道系列索引的空值