Daten aus Datenbank in eine Combobox im QT Designer

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Mars82
User
Beiträge: 13
Registriert: Freitag 19. November 2021, 23:46

HI,

ich versuche aus einer Tabelle aus einer Datenbank die Werte in eine Combobox zu lesen. Erstellt habe ich die GUI mit dem QT-Designer. Ich bekomme es nicht hin und nach stundenlanger
Google Suche dachte ich vielleicht kann mir hier geholfen werden:

Name der Combobox: combo

Hier der Quellcode:

Code: Alles auswählen

import sqlite3
from PySide6.QtWidgets import QApplication
from PySide6.QtWidgets import QMainWindow, QComboBox
from PySide6 import QtSql
from boerse import Ui_MainWindow



class Frm_main(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.bt_save.clicked.connect(self.datenschreiben)
        self.bt_finish.clicked.connect(self.ende)
        self.combo.addItems(self.combobox1())
      
     def combobox1(self):
        connection = sqlite3.connect("boerse.db")
        cursor = connection.cursor()
        sql1 = ("SELECT name FROM tb1")
        cursor.execute(sql1)
        pmList = cursor.fetchall()
        connection.commit()
        connection.close()
        return pmList
          
app = QApplication()
frm_main = Frm_main()
frm_main.show()
app.exec_()        
        
Für Hilfe wäre ich sehr dankbar.

Gruß Mars82
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du dir mal angeschaut, was combobox1 genau zurück liefert? Und was erwartet deiner Kenntnis nach addItems?
Mars82
User
Beiträge: 13
Registriert: Freitag 19. November 2021, 23:46

Hi _deets_

danke für deine schnelle Antwort. Ich habe mir es mal ausgeben lassen:

Code: Alles auswählen

import os, sys, sqlite3


connection = sqlite3.connect("boerse.db")
cursor = connection.cursor()
sql1 = ("SELECT name FROM tb1")
cursor.execute(sql1)
pmList = cursor.fetchall()
connection.commit()
connection.close()
print(pmList)
Ausgabe:

[('Biontec',), ('Ralf',), ('Apple',)]
>>>

addItem erwartet ja eine Liste und ich dachte das sieht wie eine Liste aus. Ist das falsch?

Gruß Mars82
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mars82: `addItems()` erwartet eine Liste mit Texten, also mit Zeichenketten. Du hast da eine Liste mit Tupeln mit Zeichenketten.

``tb1`` ist übrigens kein guter Tabellenname. Erst mal weiss man nicht was ``tb`` bedeuten soll, und dann nummeriert man keine Namen. Gilt dann auch für das `sql1`. Die 1 gehört da nicht hin. Die Klammern um den Wert sind auch überflüssig. Und bei dem bisschen würde ich das auch nicht noch mal extra an einen Namen binden wollen.

`pm` wäre dann wieder eine kryptische Abkürzung. Und Grunddatentypen haben in der Regel nichts in Namen zu suchen. Allgemeiner Name für Datensätze aus einer Datenbankabfrage wäre beispielsweise `rows`.

Es wird normalerweise pro Modul eine eigene Import-Anweisung verwendet, und Du gehörst hoffentlich nicht zu den Leuten die prophylaktisch grundsätzlich mit ``import os, sys`` anfangen, egal ob die Module gebraucht werden oder nicht.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import sqlite3
from contextlib import closing


def main():
    with closing(sqlite3.connect("boerse.db")) as connection:
        with closing(connection.cursor()) as cursor:
            cursor.execute("SELECT name FROM table")
            names = [row[0] for row in cursor.fetchall()]
            connection.commit()
    
    print(names)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Mars82
User
Beiträge: 13
Registriert: Freitag 19. November 2021, 23:46

@_blackjack_
Hey super erstmal vielen Dank. Das hat auf Anhieb funktioniert. Problem somit gelöst.
Ebenfalls Danke für die Extra Tipps. Also ich lerne daraus eine ordentliche sinnvolle Benennung in der Syntax. Ich versuche nur die Module zu importieren die ich auch brauche.

Beste Grüße
Ralf Liebermann
Antworten