QTableWidget mit Datenbank-Daten füllen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Dorftrottel
User
Beiträge: 4
Registriert: Donnerstag 18. Januar 2018, 18:32

Hallo zusammen,

ich versuche gerade ein QTableWidget mit Daten aus einer Datenbank zu füllen. Die Tabelle "getraenke" besitzt 3 Spalte [ID, Name, Viskosität] und bisher 6 Zeilen. Die Daten sollen nach Drücken eines Buttons angezeigt werden. Leider passiert das aber nicht und ich finde den Fehler einfach nicht.
Der Code zum anzeigen ist:

def loadData(self):
con = sqlite3.connect("ucm_db.db")
result = con.execute("SELECT * FROM getraenke")
self.tableWidget.setRowCount(0)
for row_number, row_data in enumerate(result):
self.tableWidget.insertRow(row_number)
for column_number, data in enumerate(row_data):
self.tableWidget.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))

con.close()

loadData wird dann beim Drücken des Buttons ausgeführt.

self.pushButton_show.clicked.connect(self.loadData())

Vielleicht kann mir jemand von euch einen Tipp geben oder hat eine Anleitung, wie man das Problem umsetzen könnte. Den Code oben habe ich von folgendem YouTube-Video: https://www.youtube.com/watch?v=l2OoXj1Z2hM

Danke und viele Grüße
Dorftrottel
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Dorftrottel: nein, loadData wird ausgeführt, wenn Du die ›conncet‹-Methode ausführst, so dass eigentlich schon die Daten im tableWidget stehen sollten. Wenn nicht, hast Du noch weitere Fehler im Code, den Du nicht zeigst. Bei SELECT sollten die Feldnamen explizit angegeben werden, um robust gegen Tabellendefinitionsänderungen zu sein.

Wenn Du schon QT benutzt, warum nicht auch deren Datenbank-Widgets?
Dorftrottel
User
Beiträge: 4
Registriert: Donnerstag 18. Januar 2018, 18:32

@Sirius3: Vielen Dank erstmal!

Leider stehen sie nicht darin. Auch wenn ich den Button für loadData drücke. Es wird mir aber auch kein anderer Fehler angezeigt. Es passiert einfach nichts.

Was meinst du genau mit "Bei SELECT sollten die Feldnamen explizit angegeben werden, um robust gegen Tabellendefinitionsänderungen zu sein."? Wie ist das umzusetzen?

Ich habe mich bisher noch nicht mit den QT Datenbankwidgets beschäftigt. Das könnte ich aber mal in Angriff nehmen.
Dorftrottel
User
Beiträge: 4
Registriert: Donnerstag 18. Januar 2018, 18:32

Ok, mein Fehler! Habe falsch getestet... ich kriege folgende Fehlermeldung:

Traceback (most recent call last):
File "C:/Users/Hannes/PycharmProjects/Urban_Taste/ucm_getraenke_verw.py", line 81, in <module>
ui.setupUi(dialog_db_getraenke)
File "C:/Users/Hannes/PycharmProjects/Urban_Taste/ucm_getraenke_verw.py", line 36, in setupUi
self.pushButton_show.clicked.connect(self.loadData())
File "C:/Users/Hannes/PycharmProjects/Urban_Taste/ucm_getraenke_verw.py", line 21, in loadData
self.tableWidget.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
AttributeError: 'Ui_dialog_db_getraenke' object has no attribute 'tableWidget'

Allerdings wird das tableWidget erstellt...
self.tableWidget = QtWidgets.QTableWidget(dialog_db_getraenke)
self.tableWidget.setGeometry(QtCore.QRect(40, 110, 361, 331))
self.tableWidget.setRowCount(10)
self.tableWidget.setColumnCount(3)
self.tableWidget.setObjectName("tableWidget")
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Dorftrottel: Du zeigst die entscheidenden Stellen in Deinem Code nicht, z.B Zeile 36 in der der Fehler ja auftritt. Denn tableWidget wird wahrscheinlich erst später generiert. Wie schon geschrieben, solltest Du in connect die Methode übergeben und nicht deren Rückgabewert.
Dorftrottel
User
Beiträge: 4
Registriert: Donnerstag 18. Januar 2018, 18:32

@sirius3:

Danke! Das waren zwei entscheidende Hinweise. Jetzt klappt es!

Beim nächsten Problem werde ich besser erläutern ;)

Vielen Dank!
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo "Dorftrottel" ;)

irgendwie ist es ein komische Gefühl jemandem in einem Forum so zu bezeichnen. Wie dem auch sei. Bitte verwende die Codeboxen um den Sourcecode in diesem Forum darzustellen. Das vereinfacht das Lesen von dem was man so gemacht hat.

Einfach die Dropdownliste über dem Textfenster anklicken und die entsprechende Code-Variante auswählen.

VG niesel
Antworten