Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 通过QTableWidget上的动态按钮更新和删除MySQLite数据库_Python 3.x_Pyqt_Pyqt5_Mysql Python - Fatal编程技术网

Python 3.x 通过QTableWidget上的动态按钮更新和删除MySQLite数据库

Python 3.x 通过QTableWidget上的动态按钮更新和删除MySQLite数据库,python-3.x,pyqt,pyqt5,mysql-python,Python 3.x,Pyqt,Pyqt5,Mysql Python,我已经创建了一个相当简单的应用程序,它从LineEdit中获取三个输入参数,并通过其旁边的按钮将其显示在QTablewidget中。在QTableWidget中,动态更新按钮和删除按钮在填充行值时创建。无论何时更改QTableWidget的单元格并单击update按钮,它都会更新数据库中的值。“删除”按钮有助于从数据库中删除特定行条目。我可以从QTableWidget的值中删除,但不能从数据库中删除 ui,_ = loadUiType('drake.ui') from db_new import

我已经创建了一个相当简单的应用程序,它从LineEdit中获取三个输入参数,并通过其旁边的按钮将其显示在QTablewidget中。在QTableWidget中,动态更新按钮删除按钮在填充行值时创建。无论何时更改QTableWidget的单元格并单击update按钮,它都会更新数据库中的值。“删除”按钮有助于从数据库中删除特定行条目。我可以从QTableWidget的值中删除,但不能从数据库中删除

ui,_ = loadUiType('drake.ui')
from db_new import DatabaseNew
db_new = DatabaseNew('database-punk-2')
class LoginNew(QMainWindow, ui):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.show_database()
        self.pushButton.clicked.connect(self.addToTableWidget)
    

    def addToTableWidget(self):
        self.row_data = []
        self.val1 =  self.lineEdit.text()
        self.row_data.append(self.val1)
        self.val2 = self.lineEdit_2.text()
        self.row_data.append(self.val2)
        self.val3 =  self.lineEdit_3.text()
        self.row_data.append(self.val3)


        row = self.tableWidget.rowCount()
        self.tableWidget.setRowCount(row+1)
        col = 0
        for item in self.row_data:
            cell = QTableWidgetItem(str(item))
            self.tableWidget.setItem(row, col, cell)
            col += 1
        
        db_new.insert(self.val1,self.val2, self.val3)
       
        for index in range(self.tableWidget.rowCount()):
            self.btx =  QPushButton(self.tableWidget)
            self.btn =  QPushButton(self.tableWidget)
            self.btx.setText("Update")
            self.btn.setIcon(QIcon(QPixmap("delete.png")))
            self.btn.setIconSize(QSize(35,35))
            self.btx.clicked.connect(self.update_pos)
            self.btn.clicked.connect(self.delete_pos)
            self.tableWidget.setCellWidget(index,3, self.btx)
            self.tableWidget.setCellWidget(index,4,self.btn)
        
    
    def show_database(self):
        res = db_new.fetch_data()
        self.tableWidget.setRowCount(0)
        for row_number, row_data in enumerate(res):
            self.tableWidget.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.tableWidget.setItem(row_number, column_number,  QTableWidgetItem(str(data)))

    def update_pos(self):
        self.button =self.focusWidget()
        self.index = self.tableWidget.indexAt(self.button.pos())
        self.button.clicked.connect(self.btn_trigger)
    
    def btn_trigger(self):
        QMessageBox.information(self, "Update Data", f' Value  is {self.index.row()} {self.index.column()}')
        # db_new.update(self.index.row()-1,self.val1,self.val2,self.val3)
        # Unable to find appropiate method for updating the values from the database.



        
    
    def delete_pos(self):
        rows = set()
        print("First row Value ")
        print(rows)
        for indexes in self.tableWidget.selectedIndexes():
            rows.add(indexes.row())
           

        for row in sorted(rows, reverse=True):
            self.tableWidget.removeRow(row)
        # Unable to find the appropiate logic for removing from database


def main():
    app =  QApplication(sys.argv)
    win = LoginNew()
    win.show()
    app.exec_()


if __name__ =='__main__':
    main()
数据库文件

用户界面文件图像


我无法使用“行删除”按钮更新数据库或删除特定行,我无法执行此操作。

据我所知,我理解如下:

使用
show_database()->fetch_data()
只能从数据库中获取字段description_one、description_two和status

ui,_ = loadUiType('drake.ui')
from db_new import DatabaseNew
db_new = DatabaseNew('database-punk-2')
class LoginNew(QMainWindow, ui):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.show_database()
        self.pushButton.clicked.connect(self.addToTableWidget)
    

    def addToTableWidget(self):
        self.row_data = []
        self.val1 =  self.lineEdit.text()
        self.row_data.append(self.val1)
        self.val2 = self.lineEdit_2.text()
        self.row_data.append(self.val2)
        self.val3 =  self.lineEdit_3.text()
        self.row_data.append(self.val3)


        row = self.tableWidget.rowCount()
        self.tableWidget.setRowCount(row+1)
        col = 0
        for item in self.row_data:
            cell = QTableWidgetItem(str(item))
            self.tableWidget.setItem(row, col, cell)
            col += 1
        
        db_new.insert(self.val1,self.val2, self.val3)
       
        for index in range(self.tableWidget.rowCount()):
            self.btx =  QPushButton(self.tableWidget)
            self.btn =  QPushButton(self.tableWidget)
            self.btx.setText("Update")
            self.btn.setIcon(QIcon(QPixmap("delete.png")))
            self.btn.setIconSize(QSize(35,35))
            self.btx.clicked.connect(self.update_pos)
            self.btn.clicked.connect(self.delete_pos)
            self.tableWidget.setCellWidget(index,3, self.btx)
            self.tableWidget.setCellWidget(index,4,self.btn)
        
    
    def show_database(self):
        res = db_new.fetch_data()
        self.tableWidget.setRowCount(0)
        for row_number, row_data in enumerate(res):
            self.tableWidget.insertRow(row_number)
            for column_number, data in enumerate(row_data):
                self.tableWidget.setItem(row_number, column_number,  QTableWidgetItem(str(data)))

    def update_pos(self):
        self.button =self.focusWidget()
        self.index = self.tableWidget.indexAt(self.button.pos())
        self.button.clicked.connect(self.btn_trigger)
    
    def btn_trigger(self):
        QMessageBox.information(self, "Update Data", f' Value  is {self.index.row()} {self.index.column()}')
        # db_new.update(self.index.row()-1,self.val1,self.val2,self.val3)
        # Unable to find appropiate method for updating the values from the database.



        
    
    def delete_pos(self):
        rows = set()
        print("First row Value ")
        print(rows)
        for indexes in self.tableWidget.selectedIndexes():
            rows.add(indexes.row())
           

        for row in sorted(rows, reverse=True):
            self.tableWidget.removeRow(row)
        # Unable to find the appropiate logic for removing from database


def main():
    app =  QApplication(sys.argv)
    win = LoginNew()
    win.show()
    app.exec_()


if __name__ =='__main__':
    main()
这里缺少的信息是“ID”。删除和更新功能需要此字段。您尝试使用
self.index.row()-1
来模拟这一点,但是这肯定会失败,因为ID通常是自动递增的,因此不一定再以1-2-3的方式

因此,我建议向表中添加一个ID列,并使用fetch_数据获取该字段。一旦您有了这个功能,您应该能够直接使用remove和update函数,直接实现获取的ID


如果您想分离界面,您可以,因为它不包含界面潜在用户的任何可行信息。

请提供一个,请没有代码图片。究竟是什么意外工作?是否调用了正确的函数?据我所见,您在初始化期间只调用show_database()一次,以后不再调用,因此没有更新…?@ChristianKarcher我无法更新数据库,因为我找不到如何同步QTableWidget的rowid和数据库的id(主键)。