Einzelnes Element nach Auslesen einer Datenbank aufrufen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

hi, ich bins wieder :)

kann mir jemand sagen, wie ich nach dem auslesen von adressen aus meiner datenbank, die einzelnen elemente (d.h. erstes adresselement nach dem ersten durchgang, zweites element nach dem dritten durchgang...) direkt einzelnd anzeigen lassen kann oder noch
besser, den code dafür geben, wie ich die elemente einzelnd in das tabellenfenster bekomme?
ich hab schon das netz durchforstet, leider kein ergebnis...
wär schön das mal hinzubekommen


# Auslesen der Adressen aus Datenbank

from Tkinter import *
import tkMessageBox
import tkintertable
import sqlite3
import os
from operator import itemgetter, attrgetter, methodcaller

#Auslesen der Datenbank:

db = sqlite3.connect('C:\\Users\\DMD-OL\\Desktop\\Verwaltung Arbeitszeit\\Adressendateien\\adressenliste.db')
cursor = db.cursor()
cursor.execute("SELECT ktoNum, vorname, nachname FROM adressenliste")
cursor.execute("SELECT * FROM `adressenliste` ORDER BY `nachname` ASC")
counter = 0

for row in cursor:
aktuellesKonto= ('{0} {3} {1}'.format(row[2], row[1], row[0], row[3]))
counter = counter + 1

print aktuellesKonto
print row
db.close()


Printausgabe aktuellesKonto:
Hans Meyer 10
Peter Meyer 1
Bildung Lücke 7

Printausgabe row:
(1, 0, u'asdf', u'asdf', u'asdf', u'asdf', 0, u'9.00 - 9.15', u'12.30 - 13.15')


#Erstellung Tkinter-Fenster:
root = Tk()
root.title('GUI-Verwaltung')

height = counter +1
width = 3

for z in range(height): #Zeile
for s in range(width): #Spalte

myGrid = Entry(root)
myGrid.config(relief="sunken", bg="#ddddddddd", fg="#000000000", justify='center') # width=20,
myGrid.grid(row=z, column=s)

for z in range(height): #Zeile
for s in range(width): #Spalte

datenzeile = StringVar()
datenzeile.set(aktuellesKonto)
entry_1 = Entry(textvariable=datenzeile).grid(row=z, column=s) #<-- die Printausgabe soll nacheinander in die Entries der Tabelle eingelesen werden

root.mainloop()


... mit diesem code setzt er nur die zuletzt ausgelesene adresse in die tabelle ein, und zwar vorname, nachname, ktonr in jedes einzelne entry :(
muss ich nach jedem durchgang mit db.commit() speichern? ...bin am ende...
Zuletzt geändert von Anonymous am Freitag 3. Juli 2015, 00:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
... mit diesem code setzt er nur die zuletzt ausgelesene adresse in die tabelle ein, und zwar vorname, nachname, ktonr in jedes einzelne entry
Genau das ist ja auch so im Quelltext definiert ;-)

In den beiden `for..` Loops, die das Grid durchlaufen, steht `datenzeile.set(aktuellesKonto)` - und `aktuellesKonto` wird darin eben _nicht_ verändert.

Vom vorgehen her musst du halt über den Ergebnis-Cursor iterieren und dir die Daten in Tkinter anzeigen lassen. Hier bietet sich IMHO wohl auch eher eine Tabelle an als ein Grid.

Gruß, noisefloor
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

dann muss ich also die tabelle unter das datenbankauslesen setzen und dann für aktuellesKonto "cursor" setzen?
kannst du mir vielleicht ein kurzes beispiel schicken, wie sowas allgemein gemacht wird?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

vom Prinzip ist das schon gut, was du vorhast - du musst halt nur den Code richtig "sortieren" und während du das Grid-Layout generierst über den Ergebnis-Cursor iterieren. Das mit dem `print` brauchst du nicht.

Ein einfaches Tabellen-Layout bekommst du so:

Code: Alles auswählen

import tkinter

my_data = [['foo', 'bar', 'spamegg'],
           ['1', '2', '3'],
           ['4', '5', '6']]
window = tkinter.Tk()
for row, items in enumerate(my_data):   
    for column, item in enumerate(items):
        tkinter.Label(window,
                      text=item).grid(column=column, row=row)
window.mainloop() 
Funktioniert, ist aber optisch kein Highlight ;-)

Gruß, noisefloor
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

vielen dank noisefloor...
klar, zwei schleifen eine mit row, die andere mit column. ich arsch! :)
Antworten