Seite 1 von 1
[solved] ListCtrl-Problem
Verfasst: Freitag 23. November 2007, 02:29
von nkoehring
Wahrscheinlich ists nur wieder ein kleiner Schusseligkeitsfehler... ich frag mal ganz einfach.
Was hab ich falsch gemacht, wenn nach dem einfuegen eines Listenelements folgendes passiert:
ein bissl Code:
Code: Alles auswählen
# das ListCtrl:
self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.LC_SORT_ASCENDING)
self.list.InsertColumn(0, "Name", wx.LIST_FORMAT_CENTRE)
self.list.InsertColumn(1, "Zusatz 1", wx.LIST_FORMAT_CENTRE)
self.list.InsertColumn(2, "Zusatz 2", wx.LIST_FORMAT_CENTRE)
self.list.InsertColumn(3, "Zusatz 3", wx.LIST_FORMAT_CENTRE)
# der Code zum Anhaengen der Daten:
def Append(self, id, v1, v2, v3):
self.list.Append([id, v1, v2, v3])
Verfasst: Freitag 23. November 2007, 07:58
von BlackJack
Du musst Dir anschauen wo Du `Append()` aufrufst und warum Du dort die eingebaute Funktion `id()` übergibst.
Verfasst: Samstag 24. November 2007, 02:12
von nkoehring
BlackJack hat geschrieben:Du musst Dir anschauen wo Du `Append()` aufrufst und warum Du dort die eingebaute Funktion `id()` übergibst.
oh... ja das ist nur ausversehen im Beispiel passiert. Das ist garnicht mein Problem. Viel mehr stoert mich, dass manchmal die Elemente der vorherigen Zeile verschwinden (außer dem ersten eben), wenn ich eine neue Zeile anfuege...
Verfasst: Dienstag 27. November 2007, 06:18
von nkoehring
Ich weiß nicht ob ich mich vielleicht einfach mieß ausgedrueckt habe, deshalb versuche ich nochmal mein Problem zu beschreiben:
Ich habe ein ListCtrl mit mehreren Spalten. Wenn ich ein Element anfuege klappt das wunderbar => jede Spalte bekommt ihren Eintrag ordnungsgemaesz. Manchmal verschwinden aber alle Eintraege ab der zweiten Spalte, nachdem ich eine neue Zeile eingefuegt habe.
Inzwischen bin ich mir relativ sicher, dass das immer dann passiert wenn die neue Zeile vor existierenden Zeilen eingefuegt wird (das ListCtrl ist sortierend).
Woran kann das liegen? Weiß jemand Abhilfe oder moegliche Gruende?
Verfasst: Dienstag 27. November 2007, 06:42
von gerold
nkoehring hat geschrieben:Weiß jemand Abhilfe oder moegliche Gruende?
Hallo nkoehring!
Nur so als Versuch:
- self.list.Refresh()
- self.list.SortItems()
mfg
Gerold
Verfasst: Dienstag 27. November 2007, 09:58
von nkoehring
Was kann ich denn dem ListCtrl.SortItems() als Sorter uebergeben? Allerdings hilft es bisher (mit None) nicht... auch der Refresh() scheint nichts zu bringen
Verfasst: Dienstag 27. November 2007, 11:51
von gerold
nkoehring hat geschrieben:scheint nichts zu bringen
Hallo nkoehring!
Schon mit InsertStringItem und SetStringItem probiert?
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import wx
import sys
wx.SetDefaultPyEncoding("iso-8859-15")
class MyFrame(wx.Frame):
def __init__(
self, parent = None, title = "Example", size = wx.Size(550, 420)
):
wx.Frame.__init__(self, parent, -1, title, size = size)
panel = wx.Panel(self)
vbox_main = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox_main)
my_list = wx.ListCtrl(panel, style = wx.LC_REPORT | wx.LC_SORT_ASCENDING)
my_list.InsertColumn(sys.maxint, "Name", wx.LIST_FORMAT_CENTRE)
my_list.InsertColumn(sys.maxint, "Zusatz 1", wx.LIST_FORMAT_CENTRE)
my_list.InsertColumn(sys.maxint, "Zusatz 2", wx.LIST_FORMAT_CENTRE)
my_list.InsertColumn(sys.maxint, "Zusatz 3", wx.LIST_FORMAT_CENTRE)
vbox_main.Add(my_list, 1, wx.EXPAND | wx.ALL, 5)
self.my_list = my_list
rows = (
("Zeile B", "Upsid", "lafala", "7uuu"),
("Zeile C", "Upsia", "lalda", "2uuu"),
("Zeile A", "Upsi", "lala", "u5uu"),
("Zeile D", "Upsif", "lalaa", "u3uu"),
("Zeile G", "Upsiw", "lalva", "uu4u"),
("Zeile R", "Upsir", "qlala", "uuu5"),
("Zeile F", "Upsiw", "lrala", "uduu"),
("Zeile E", "Upsie", "lwala", "uudu"),
)
self.rows = rows
self.append_rows()
btn = wx.Button(panel, label = "append")
vbox_main.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
btn.Bind(wx.EVT_BUTTON, self.append_rows)
def append_rows(self, event = None):
rows = self.rows
my_list = self.my_list
for row in rows:
index = my_list.InsertStringItem(sys.maxint, row[0])
for i in xrange(1, 4):
my_list.SetStringItem(index, i, row[i])
def main():
"""Testing"""
app = wx.PySimpleApp()
f = MyFrame()
f.Center()
f.Show()
app.MainLoop()
if __name__ == "__main__":
main()
mfg
Gerold
Verfasst: Mittwoch 28. November 2007, 17:52
von nkoehring
Ah die Felder einzeln zu fuellen ist natuerlich auch eine Variante... wenn auch ein wenig umstaendlich.
Aber danke... es funktioniert nun wunderbar
Verfasst: Donnerstag 7. Februar 2008, 01:36
von noise
Hi nkoehring, wie von dir vermutet passiert das nur bei den flags ``wx.LC_SORT_ASCENDING`` und ``wx.LC_SORT_DESCENDING``, also beim sortieren. Das ganze ist ein Bug den ich vor einiger Zeit auch entdeckt habe und mich ehrlich frage wieso das ganz so viele Jahre unentdeckt geblieben ist!?! Ich hoffe es leigt nicht an den ``InsertStringItem``-"workarounds", die ja doch heufiger als Antwort auftauchen
Die originale Implementation (in wx._controls):
Code: Alles auswählen
def Append(self, entry):
'''Append an item to the list control. The entry parameter should be a
sequence with an item for each column'''
if len(entry):
if wx.USE_UNICODE:
cvtfunc = unicode
else:
cvtfunc = str
pos = self.GetItemCount()
self.InsertStringItem(pos, cvtfunc(entry[0]))
for i in range(1, len(entry)):
self.SetStringItem(pos, i, cvtfunc(entry[i]))
return pos
Wenn Ihr genau hischaut seht ihr den fehler
self.ItemCount bzw. self.GetItemCount() als position für `SetStringItem` zu nehmen ist mehr als dumm
hier mal der Bugfix:
Code: Alles auswählen
def Append(self, entry):
'''Append an item to the list control. The entry parameter should be a
sequence with an item for each column'''
if len(entry):
if wx.USE_UNICODE:
cvtfunc = unicode
else:
cvtfunc = str
pos = self.InsertStringItem(self.GetItemCount(), cvtfunc(entry[0]))
for i in range(1, len(entry)):
self.SetStringItem(pos, i, cvtfunc(entry[i]))
return pos
Und hier das diff von mir für den "aktuellen" trunk:
Code: Alles auswählen
Index: src/_listctrl.i
===================================================================
--- src/_listctrl.i (Revision 51362)
+++ src/_listctrl.i (Arbeitskopie)
@@ -821,8 +821,7 @@
cvtfunc = unicode
else:
cvtfunc = str
- pos = self.GetItemCount()
- self.InsertStringItem(pos, cvtfunc(entry[0]))
+ pos = self.InsertStringItem(self.GetItemCount(), cvtfunc(entry[0]))
for i in range(1, len(entry)):
self.SetStringItem(pos, i, cvtfunc(entry[i]))
return pos
OT: Naja, an einigen stellen ist wxPyhon doch schon ziemlich kaputt, leider. Und wirklich kooperativ sind die core devs insofern nicht, als das viele Bugs mit FERTIGEN patches im bugtracker seit Jahren vergammeln. Entschuldigt mein Unmut, aber ein wenig schade ist es schon
Verfasst: Montag 11. Februar 2008, 13:42
von nkoehring
noise hat geschrieben:OT: Naja, an einigen stellen ist wxPyhon doch schon ziemlich kaputt, leider. Und wirklich kooperativ sind die core devs insofern nicht, als das viele Bugs mit FERTIGEN patches im bugtracker seit Jahren vergammeln. Entschuldigt mein Unmut, aber ein wenig schade ist es schon
Ja da geb ich dir vollkommen recht... Danke jedenfalls fuer den Patch.