VIRTUAL ListCtrl / Dictionary von hinten lesen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Damaskus
Administrator
Beiträge: 911
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Dienstag 23. September 2008, 13:17

Hi,
ich hab ein Dictionary mit {id:wert} das permanent wächst und aus dem ein VIRTUAL wx.Listctrl mit der Funktion

Code: Alles auswählen

    def OnGetItemText(self, item, col):
        data = data_fms[item]
        wert = data[col]
        return wert
gefüllt wird.
Gibts dafür eine Methode mit der ich das Dict. von hinten auslesen kann?
Bisher wird immer von 0 bis 9999 ausgelesen.

Ist bestimmt ganz einfach, aber ich komm grad nicht drauf.

Gruß
Damaskus
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Dienstag 23. September 2008, 13:24

Ein Dictionary hat keine Reihenfolge, daher gibt es kein "hinten". Du missbrauchst ein Dictionary als Liste, so wie ich das sehe.
Die Zahl der gespeicherten Elemente liefert jedoch:

Code: Alles auswählen

len(dictionary)
Benutzeravatar
Damaskus
Administrator
Beiträge: 911
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Dienstag 23. September 2008, 13:51

Code: Alles auswählen

{
0: ['23.9.2008', '14:38:30', 'Feuerwehr', 'Baden-W\xfcrttemberg', u'Testkreis', u'Testort', '45', 'Sprechwunsch', '62466445', 'Fzg -> Lst', '5', '0', '0'], 
1: ['23.9.2008', '14:38:31', 'Feuerwehr', 'Baden-W\xfcrttemberg', u'Testkreis', u'Testort', '45', 'Nicht Einsatzbereit', '62466445', 'Fzg -> Lst', '6', '0', '0'], 
2: ['23.9.2008', '14:38:31', 'Feuerwehr', 'Baden-W\xfcrttemberg', u'Testkreis', u'Testort', '45', 'Patient aufgenommen', '62466445', 'Fzg -> Lst', '7', '0', '0'], 
3: ['23.9.2008', '14:38:31', 'Feuerwehr', 'Baden-W\xfcrttemberg', u'Testkreis', u'Testort', '45', 'Im Krankenhaus', '62466445', 'Fzg -> Lst', '8', '0', '0'], 
4: ['23.9.2008', '14:38:32', 'Feuerwehr', 'Baden-W\xfcrttemberg', u'Testkreis', u'Testort', '45', 'Handquittung', '62466445', 'Fzg -> Lst', '9', '0', '0'], 
5: ['23.9.2008', '14:38:33', 'Feuerwehr', 'Baden-W\xfcrttemberg', u'Testkreis', u'Testort', '45', 'NN', '62466445', 'Fzg -> Lst', 'A', '0', '0'], 
6: ['23.9.2008', '14:38:33', 'Feuerwehr', 'Baden-W\xfcrttemberg', u'Testkreis', u'Testort', '45', 'NN', '62466445', 'Fzg -> Lst', 'B', '0', '0']
}
So sieht mein Dict. aus. Und wird permanant mit neuen Werten gefüllt.

Ich brauch die Zuweisung ID:Wert weil ich die Werte in vielen Funktionen wieder auslese. Und dazu sollte ja ein Dict. da sein.

Nun will ich eine Übersicht über alle Werte mit einem ListCtrl erzeugen.
Im Dict. steht der älteste Eintrag beim Schlüssel 0 und der neueste Eintrag bei X. Wenn ich die Werte ins ListCtrl übertrage verwende ich dazu

Code: Alles auswählen

self.SetItemCount(len(data_fms))
Damit wird Eintrag 0 als erstes in die Liste eingetragen und dann die weiteren Einträge.
Ich will aber das Eintrag 6 an Pos. 1 steht, 5 an 2, 4 an 3, usw...
Bei SQL kann man die Sortierung per "DESC" umdrehen.

Sowas in der Art Suche ich grad für die Problemstellung. Wenns da überhaupt einfaches gibt. Ansonsten muss ich mir da eine neue Funktion überlegen die jeden Wert einzeln übergibt.

Gruß
Damaskus
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Dienstag 23. September 2008, 14:30

hi,
ich habe zwar noch nichts mit der VIRTUAL ListCtrl gemacht, nur mit dem normalen, und daher noch nicht mit der Methode 'SetItemCount' herumgespielt. Aber ich bin mir relativ sicher das du mit dieser Methode nicht deine Werte überträgst. Die Doku ist der Meinung das damit lediglich die Anzahl der Elemente festgelegt wird. Vielleicht schaust du noch mal nach und verrätst wie du die Daten in das ListCtrl schreibst?

Sebastian
Benutzeravatar
Damaskus
Administrator
Beiträge: 911
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Dienstag 23. September 2008, 15:22

Mit SetItemCount wird eine Anzahl an Einträgen an das ListCtrl übergeben und gleichzeitig wird die Funktion OnGetItem Text aufgerufen die man überlädt und mit der man die Werte an das ListCtrl übergibt.

Code: Alles auswählen

wxListCtrl::OnGetItemText

virtual wxString OnGetItemText(long item, long column) const

This function must be overloaded in the derived class for a control with wxLC_VIRTUAL style. It should return the string containing the text of the given column for the specified item.
Aber ich glaub ich führe einfach nur ein zweites Dict. ein und belade das anderster. Dann hab ich auf Wunsch beide Ansichten zur Verfügung.
Wird warscheinlich leichter sein.

Gruß
Damaskus
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Dienstag 23. September 2008, 15:37

Da hätte ich in der Doku mal noch weiter die Querverweise lesen sollen :?

also ich merke gerade mal wieder das ich vermutlich nicht der richtige Ansprechpartner bin, mir fallen auf Anhieb wieder mehrere Möglichkeiten ein das mit Schleifendurchläufen zu erledigen.
Allerdings, bevor ich die Daten doppelt Vorhalten muss - und damit ja auch immer doppelt aktualisieren- damit ich sie jederzeit in der Richtigen Reihenfolge vorliegen habe. Würde ich evtl. überlegen ob eine Liste nicht Sinnvoller wäre. Die kann ich jederzeit sortiert ausgeben lassen - was ja anscheinend bei dir erwünscht ist.
BlackJack

Dienstag 23. September 2008, 15:37

Vielleicht solltest Du zum Speichern einer Liste aber vielleicht auch wirklich eine Liste nehmen und kein Dictionary. Listen sind geordnet und haben deshalb zum Beispiel auch eine `reverse()`-Methode um die Reihenfolge der Elemente umzukehren.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Dienstag 23. September 2008, 18:12

du hast doch eine fortlaufende TIME
mit der höchsten TIME in der liste ist dein letzter datensatz
reicht eigentlich wx.grid nicht aus um das anzuzeigen!
Antworten