Bei aktualisierung von QTablewidget aus DB werden Daten doppelt angehangen.

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 81
Registriert: Sonntag 13. Januar 2013, 16:00

Freitag 9. März 2018, 08:32

Hallo!

Ich habe ein Programm bei dem mit dem Aufruf der GUI ein QTAbelwidget mit Daten aus einer Datenbank gefüllt wird. Das funktioniert so weit auch richtig gut. Nun habe ich ein Dialog geschrieben, bei dem weitere Daten in die Datenbank eingetragen werden können. Wenn der Dialog geschlossen wird und die Daten in die DB eingetragen worden sind, soll die Tabelle die Daten erneut aus der Datenbank erhalten und eben aktualisieren werden. Leider bleiben die alten Daten die vorher drin waren stehen und die Daten des neue DB-Request werden unten an die Tabelle angegangen. Hab ich also z.B. vorher 4 Zeilen in der Tabelle und füge ein Eintrag in die DB hinzu, dann habe ich nach schließen nicht 5 Einträge, sondern 9.

Ich rufe die Methode load_ku_data einmal in Konstrukor beim Programmstart auf, um die Tabelle initial zu befüllen und ich rufe die Methode auf, nach dem ich den Dialog geschlossen habe. Wenn ich den Dialog verlassen habe, gebe ich noch ein Parameter mit, um in der load_ku_data das Leeren der Tabelle auszulösen. Aber das scheint offenbar nicht zu funktionieren

Aktuell gehe ich dabei wie folgt vor.

Code: Alles auswählen

class InitApplication(QtWidgets.QMainWindow):
    ku_data = []

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("ABU-Professional")
        self.ui = Ui_MainWindow()
        ....
        self.load_ku_data() #läd die Daten aus der Datenbank und bekommt ein zweidimensionales Array und befüllt die Tabelle

     def load_ku_data(self, update=False):
        if update:
            print("Rowcount vor löschen" + str(self.ui.kuDatenTbl.rowCount())) #44
            self.ui.kuDatenTbl.clearSelection()
            self.ui.kuDatenTbl.clearContents()
            self.ui.kuDatenTbl.setRowCount(0)
            self.ui.kuDatenTbl.clear()
            print("Rowcount nach löschen" + str(self.ui.kuDatenTbl.rowCount())) #0
        do = DatabaseOperations()
        ku_tbl = do.get_ku_list()
        if len(ku_tbl) < 1:
            self.ui.no_Ku_Datas_LB.setVisible(True)
        for i in range(len(ku_tbl)):
            self.ku_data.append(ku_tbl[i][2:12]) #Slicing da PK und FK nicht in Tabelle benötigt werden
        print(self.ku_data)
        for row in range(0, len(self.ku_data)):
            row_count = self.ui.kuDatenTbl.rowCount()
            self.ui.kuDatenTbl.insertRow(row_count)
            for col in range(0, len(self.ku_data[row])):
                item = self.ku_data[row][col]
                self.ui.kuDatenTbl.setItem(row, col, QtWidgets.QTableWidgetItem(item))

...
 def show_neuerKunde_dialog(self):
        new_customer = {}
        neuer_kunde_dialog = QtWidgets.QDialog()
        self.new_cust_dialog.setupUi(neuer_kunde_dialog)
        cust_op = Customeroperations()
        self.new_cust_dialog.abwLiefAdrrCB.stateChanged.connect(lambda:self.change_neuer_kunde_dialog(self.new_cust_dialog))
        self.new_cust_dialog.buttonBox.button(QtWidgets.QDialogButtonBox.Save).clicked.connect(lambda: cust_op.speicherKunde(
            name=self.new_cust_dialog.kuNameLe.text(),
            vorname=self.new_cust_dialog.kuVorNameLe.text(),
            strasse=self.new_cust_dialog.kuStrHNrLe.text(),
                            ))
        neuer_kunde_dialog.exec_()
        self.load_ku_data(True) #Aufruf um Tabelle zu aktualiseren und vorher zu leeren
Was mache ich falsch, beim aktualisieren der Tabelle?

VG niesel
Sirius3
User
Beiträge: 8282
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 9. März 2018, 09:11

@nieselfriem: was scheint nicht zu funktionieren? Werden die `print`s nicht aufgerufen, werden sie aufgerufen, aber die Anzahl ist nicht 0? Ist die Anzahl 0 aber trotzdem die alten Daten wieder da? Was macht get_ku_list?

Du benutzt Klassenvariablen falsch. `ku_data` muß in __init__ angelegt werden. Bei `print` gibt man mehrere Variablen mit Komma getrennt an und baut sich nicht mit + was zusammen (wenn man einen String braucht, benutzt man format). Vermeide unsinnige Abkürzungen. Dass es sich um Daten handelt, ist klar, aber was ist `ku`? `ku_tbl` ist dann keine Tabelle! `for i in range` ist ein Anti-pattern, weil man viel lesbarer und einfacher direkt über den Inhalt der Liste iterieren kann. `self.ku_data` ist unnötig. Da werden nur immer neue Daten angehängt, die Liste nie gelöscht, und man könnte ohne das Umkopieren direkt mit ku_tbl arbeiten. `def load_ku_data` ist falsch eingerückt.

Code: Alles auswählen

class InitApplication(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("ABU-Professional")
        self.ui = Ui_MainWindow()
        self.load_ku_data() #läd die Daten aus der Datenbank und bekommt ein zweidimensionales Array und befüllt die Tabelle
 
    def load_ku_data(self):
        kunden_table = self.ui.kuDatenTbl
        kunden_table.clearSelection()
        kunden_table.clearContents()
        kunden_table.clear()
        do = DatabaseOperations()
        kunden = do.get_ku_list()
        kunden_table.setRowCount(len(kunden))
        if kunden:
            for row, entry in enumerate(kunden):
                for col, item in enumerate(entry[2:12]):
                    kunden_table.setItem(row, col, QtWidgets.QTableWidgetItem(item))
        else:
            self.ui.no_Ku_Datas_LB.setVisible(True)
Benutzeravatar
nieselfriem
User
Beiträge: 81
Registriert: Sonntag 13. Januar 2013, 16:00

Montag 12. März 2018, 11:24

Hallo Sirius3,

danke für deine Hinweise. Deine Art habe ich ausprobiert und siehe da, es funktioniert. Ich werde noch mal für mich analysieren, warum meine unsaubere Art nicht richtig funktioniert hat. Was die Ausgabe betrifft, muss ich mich noch etwas umgewöhnen. Ich habe mich mit der Methode "String {0}".format(var) ganz gut angefreundet. Die enumerate-Funktion erleichtert in der tat sehr viel.

Danke für deine Mühe

VG niesel
Sirius3
User
Beiträge: 8282
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 12. März 2018, 11:46

@nieselfriem: Dein Problem waren globale Variablen.
Antworten