[solved] ListCtrl-Problem

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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:
Bild

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])
Zuletzt geändert von nkoehring am Mittwoch 28. November 2007, 17:52, insgesamt 1-mal geändert.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
BlackJack

Du musst Dir anschauen wo Du `Append()` aufrufst und warum Du dort die eingebaute Funktion `id()` übergibst.

Code: Alles auswählen

In [247]: id
Out[247]: <built-in function id>
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

BlackJack hat geschrieben:Du musst Dir anschauen wo Du `Append()` aufrufst und warum Du dort die eingebaute Funktion `id()` übergibst.

Code: Alles auswählen

In [247]: id
Out[247]: <built-in function id>
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...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

nkoehring hat geschrieben:Weiß jemand Abhilfe oder moegliche Gruende?
Hallo nkoehring!

Nur so als Versuch:
- self.list.Refresh()
- self.list.SortItems()

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Was kann ich denn dem ListCtrl.SortItems() als Sorter uebergeben? Allerdings hilft es bisher (mit None) nicht... auch der Refresh() scheint nichts zu bringen :(
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Ah die Felder einzeln zu fuellen ist natuerlich auch eine Variante... wenn auch ein wenig umstaendlich. Aber danke... es funktioniert nun wunderbar :)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
noise
User
Beiträge: 62
Registriert: Donnerstag 7. Februar 2008, 00:15

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 :D 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 :roll:
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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 :roll:
Ja da geb ich dir vollkommen recht... Danke jedenfalls fuer den Patch.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten