DropDown Menü mit Inhalt aus einer DB

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Guten Morgen Forum,

Ich melde mich wieder mit einer Frage zurück.
Mein jetziges Problem besteht darin das der Inhalt des DropDown-Menüs
nur mit dem letzten Datensatz aus der Tabelle gefüllt wird. Hätte aber gerne
alle Datensätze darin.

Code: Alles auswählen

connection = psycopg2.connect("dbname=sqltest")
connection.commit()
cursor = connection.cursor()
sql=("SELECT * FROM staatsangehoerigkeit")
cursor.execute(sql)

staat = StringVar()

for dsatz in cursor:
    staatsangehoerigkeit    =   dsatz[0]
    OptionMenu(tab_kunde_neu, staat, print(staat.get()), staatsangehoerigkeit).grid(row=2, column=4, sticky=NSEW)
    staat.set(staatsangehoerigkeit)
Über Konsole spukt er mir alle 195 Datensätze aus aber halt nur den letzten im DropDown-Menü.
Sicherlich ein simpler Fehler wieder den ich nicht finde.

Würde mich freuen wenn Ihr mir wieder helfen könntet.


Gruß Kalli


ps. So zeigt er mir den Ersten und den Letzten Datensatz an

Code: Alles auswählen

connection = psycopg2.connect("dbname=sqltest")
connection.commit()
cursor = connection.cursor()
sql=("SELECT * FROM staatsangehoerigkeit")
cursor.execute(sql)

staat = StringVar()

for dsatz in cursor:
    staatsangehoerigkeit    =   dsatz[0]
    OptionMenu(tab_kunde_neu, staat, staat.get(), staat.set(staatsangehoerigkeit), staatsangehoerigkeit).grid(row=2, column=4, sticky=NSEW)
BlackJack

@Kalli87: Das sieht aber extrem nach wild herum raten welche Argumente `OptionMenu` vielleicht nehmen mag aus. So funktioniert programmieren nicht. Du musst wissen was eine Funktion oder Klasse als Argumente erwartet und was Aufrufe von anderen Funktione und Methoden als Rückgabewerte liefern.

Die Signatur von `OptionMenu` sieht so aus: ``OptionMenu(self, master, variable, value, *values, **kwargs)``. Als zweites Argument beim Aufruf wird der ausgewählte Wert erwartet und danach kommen so viele Argumente wie Auswahlmöglichkeiten bestehen (abzüglich des ausgewählten). Du musst also *ein* `OptionMenu` erstellen und da *alle* 195 Werte übergeben. Was Du da machst ist in der Schleife 195 verschiedene `OptionMenu` erstellen mit jeweils einem Wert die alle an der gleichen Stelle in der GUI angeordnet werden, so dass man effektiv nur das letzte erstellte sehen kann.

Eventuell hilft hier ja Effbots Tkinter-Buch weiter: http://effbot.org/tkinterbook/optionmenu.htm

Edit: Da das schon etwas älter ist: `apply()` sollte man nicht mehr verwenden, da gibt es mittlerweile eine spezielle Syntax für. Steht in der Dokumentation.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack
Danke für deine Hilfe, leider muss ich mich doch wieder zu Wort melden.

Ich versteh es ehrlich gesagt nicht wie ich die Datensätze in das DropDown-Menü bekomme.
Schließlich will ich es ja per Datenbankanbindung haben und ich hab ehrlich gesagt keine lust 195
Datensätze per Hand als "values" einzutragen.

Gruß Kalli
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

*push*
Sorry das ich es so mache, aber anscheinend wird nur so der Zeitstempel aktualisiert und
nicht wenn man einen Beitrag editiert.
BlackJack

@Kalli87: Im Tkinter-Book vom Effbot ist ein Beispiel wie man Optionen die in einer Liste stehen verwendet. Wo ist denn jetzt das Problem die Werte aus der Datenbank in eine Liste zu stecken und die dann zu verwenden?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Wie du schon geschrieben hast, die Werte in eine Liste packen.... :oops:

Ich steig einfach nicht dahinter, das Beispiel was du mir genannt hast
ist zwar gut und schön ich versteh es auch wenn man selbst die "Values" einträgt
nur hilft es mir leider nicht wie ich das ganze mit der Datenbank lösen soll.....
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Hab es teilweise gelöst:

Code: Alles auswählen

staat = StringVar(tab_kunde_neu)
staat.set("Staatsangehörigkeit") # initial value

laender=[]
for dsatz in (cursor):
    staatsangehoerigkeit = dsatz[0]
    laender.append(staatsangehoerigkeit)

dropdown = OptionMenu(tab_kunde_neu, staat, staat.get(), laender)
dropdown.grid(row=2, column=4, sticky=NSEW )
Nur hab ich jetzt die ganzen 195 Datensätze in einer Zeile stehen....


Gut gelöst hab das * vergessen bei laender
Antworten