Sqlite Daten in Listctrl

Plattformunabhängige GUIs mit wxWidgets.
Antworten
smudo

Donnerstag 5. Januar 2006, 13:07

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
BlackJack

Donnerstag 5. Januar 2006, 23:45

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;
smudo

Freitag 6. Januar 2006, 08:05

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
smudo

Freitag 6. Januar 2006, 09:04

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Freitag 6. Januar 2006, 09:18

[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)
smudo

Freitag 6. Januar 2006, 09:49

Ich glaube, du hast das SetItemData vergessen.
also bei mir verändert das nix an der Ausgabe, muss noch an anderen Dingen liegen
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Samstag 7. Januar 2006, 12:55

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.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Samstag 7. Januar 2006, 13:03

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()
Antworten