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