Seite 1 von 1

Sqlite Daten in Listctrl

Verfasst: Donnerstag 5. Januar 2006, 13:07
von smudo
Mahlzeit,
habe folgendes Problem, ich schreibe Daten über pysqlite in eine tabelle,
diese soll dann gelesen und in eine liste mit einzelnen Spalten übertragen werden, nutze z.z. Listctrl dafür aber es klappt ihrgendwie nicht

Code: Alles auswählen

        a = str(self.rl1.GetLineText(0))
        b = str(self.rl2.GetLineText(0))
        c = str(self.rl3.GetLineText(0))
        d = str(self.rl4.GetLineText(0))
        e = str(self.rl5.GetLineText(0))
        f = str(self.rl6.GetLineText(0))
        
        INSERT1 = "INSERT INTO testdb VALUES ('" + str(self.__id) + "','" + a+ "','" + b+ "','" +c+ "','" +d+ "','" +e+ "','" +f+"')"
        self.__id += 1
        insert = self.__cursor.execute(INSERT1)             # 6 Eintraege vornehmen
        SELECT  = "SELECT * FROM testdb"
        self.__cursor.execute(SELECT)              # Datensaetze anzeigen
        while True:
            satz = self.__cursor.fetchone()        # eine Zeile aus der Ergebnismenge
            if not satz: break
        
            for kette in satz:              # in Komponenten zerlegen
                print kette, '\t  ',        # KEIN Zeilenvorschub
            print                           # naechste Zeile, d.h. NUR Zeilenvorschub
danach soll die übergabe erfolgen

Verfasst: Donnerstag 5. Januar 2006, 23:45
von BlackJack
Könntest Du das "klappt irgendwie nicht" präzisieren? Was klappt nicht? Auslesen aus der GUI, schreiben in die Datenbank, auslesen aus der Datenbank? Gibt's Fehlermeldungen?

Ein Hinweis zur SQL-Zeichenkette: Werte sollte man niemals selbst da reinbasteln sondern immer den zweiten Parameter von `cursor.execute()` benutzen. Sonst könnte mal jemand etwas folgender Art in die GUI eintippen:

Code: Alles auswählen

'; DELETE FROM testdb;

Verfasst: Freitag 6. Januar 2006, 08:05
von smudo
ich habe schwiergkeiten die 6 werte, die der benutzer über die Gui selbst
erstellt, welche dann auch in der Datenbank stehen in das listctrl zu bringen.

Wenn ich mit wx.ListCtrl.SetStringItem(index, col, label, imageId) arbeite
erhalte ich keinen Fehler, jedoch keine Ausgabe //
bei einem Dictionary werden die Daten richtig ausgegeben.

stelle da mal was um und poste danach den quelltext

Verfasst: Freitag 6. Januar 2006, 09:04
von smudo
so hier das beispiel wie es mit dictionary klappt

Code: Alles auswählen

        panel = wx.Panel(self, -1, pos = (1,10), size = (600,430))
        
        self.__list = wx.ListCtrl(panel, -1 , pos = (1,10), size = (600,400), style = wx.LC_REPORT 
                                 | wx.BORDER_NONE
                                 | wx.LC_EDIT_LABELS
                                 | wx.LC_SORT_ASCENDING
                                )

        self.__list.SetBackgroundColour('White')
        self.__list.InsertColumn(0, "Artist")
        self.__list.InsertColumn(1, "Song")
        self.__list.InsertColumn(2, "Genre")
        musicdata = {
            1 : ("Blumentopf", "Liebe und Hass", "Hip Hop"),
            2 : ("Blumentopf", "6 Meter 90", "Hip Hop"),
            3 : ("Blumentopf", "Von Disco zu Disco", "Hip Hop"),
            4 : ("Blumentopf", "Party Safari", "Hip Hop"),
            5 : ("Blumentopf", "Hueftschwung", "Hip Hop"),
            6 : ("Blumentopf", "Am Schachbrett", "Hip Hop"),
            7 : ("Blumentopf", "Wir warten", "Hip Hop"),
            }
        items = musicdata.items()
        for key, data in items:
            index = self.__list.InsertStringItem(sys.maxint, data[0])
            self.__list.SetStringItem(index, 1, data[1])
            self.__list.SetStringItem(index, 2, data[2])
            self.__list.SetItemData(index, key)

ähnlich jetzt bei dem db-satz, hier soll erstmal nur ein satz
ins listctrl geladen werden

Code: Alles auswählen

        a = 'hallo'
        b = 'hallo1'
        c = 'hallo2'
        d = 'hallo3'
        e = 'hallo4'
        f = 'hallo5'
        
        INSERT1 = "INSERT INTO testdb VALUES ('" + str(self.__id) + "','" + a +"','" + b+ "','" +c+ "','" +d+ "','" +e+ "','" +f+"')"
        self.__id += 1
        insert = self.__cursor.execute(INSERT1)             # 6 Eintraege vornehmen
        SELECT  = "SELECT * FROM testdb"
        self.__cursor.execute(SELECT)              # Datensaetze anzeigen

        kette = self.__cursor.fetchone()
        print kette
        self.__list.SetStringItem(1,1, str(kette[0]))
        self.__list.SetStringItem(1,1, str(kette[1]))
        self.__list.SetStringItem(1,1, str(kette[2]))
        self.__list.SetStringItem(1,1, str(kette[3]))
        self.__list.SetStringItem(1,1, str(kette[4]))
        self.__list.SetStringItem(1,1, str(kette[5]))
        
        self.__list.Refresh()
        self.__cursor.close()                      # housekeeping
        self.__myconn.close()
erhalte leider keine ausgabe der daten
hoffe irgendwer hat eine idee, danke schon mal im voraus

Verfasst: Freitag 6. Januar 2006, 09:18
von Francesco
[quote="smudo"]so hier das beispiel wie es mit dictionary klappt

Code: Alles auswählen


        self.__list.SetStringItem(1,1, str(kette[5]))
        
Ich glaube, du hast das SetItemData vergessen.

z.B.

Code: Alles auswählen

self.___list.SetItemData(index, index)

Verfasst: Freitag 6. Januar 2006, 09:49
von smudo
Ich glaube, du hast das SetItemData vergessen.
also bei mir verändert das nix an der Ausgabe, muss noch an anderen Dingen liegen

Verfasst: Samstag 7. Januar 2006, 12:55
von Francesco
smudo hat geschrieben:
Ich glaube, du hast das SetItemData vergessen.
also bei mir verändert das nix an der Ausgabe, muss noch an anderen Dingen liegen
Schwierig zu sagen:

ListCtrl ist zu sehen? Columns sind zu sehen?
Du fängst mit index 0 an?
Wie ich sehe, setzt du mit SetStringItem gleich mit index 1.

Hast du den ersten Eintrag einer Listzeile (Column 0) mit
InsertStringItem(x,y) eingefügt und nicht mit SetStringItem?

Ich glaube das .Refresh() braucht man eigentlich nicht.

Verfasst: Samstag 7. Januar 2006, 13:03
von Francesco
Noch ein kleines Beispiel, das du mit deinem Code vergleichen könntest:

Code: Alles auswählen

import wx

app = wx.App()
frame = wx.Frame(None, -1, 'Frame')
listctrl = wx.ListCtrl (frame, style=wx.LC_REPORT )
listctrl.InsertColumn(0, "Col1")
listctrl.InsertColumn(1, "Col2")
listctrl.InsertColumn(2, "Col3")
for index in range (0, 2):
    listctrl.InsertStringItem(index, "Entry1")
    listctrl.SetStringItem(index, 1, "Entry2")
    listctrl.SetStringItem(index, 2, "Entry3")
    listctrl.SetItemData(index, index)
frame.Show()
app.MainLoop()