首页 > 解决方案 > 如何使用 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()

标签: pythonpandascsvuser-interfacepyqt5

解决方案


也许这会有所帮助,它会读取整个

                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('')

推荐阅读