Es ist zum Verzweifeln..
Habe ein Beispiel zusammen kopiert und da geht es. Habe den Code zwar weitestgehend aus meiner Klasse so übernommen, doch es poppt kein Dialog auf, wie es in der vollen Version meiner Listenbibliothek in diesem Zusammenhang der Fall ist.
Sprich irgendwo muss ich einen blöden Fehler haben.
Ich schildere es mal kurz. Ich ermögliche dem Anwender, einen Datensatz aus der Liste zu editieren. Wenn er auf "Bearbeiten" geht, poppt ein Dialog mit den Werten des DS auf, dessen Werte er ändern möchte. Nun kann es aber sein, dass er z.B. den Nachnamen einer Person in einer Personenliste ändert. Wenn die Liste nach der Nachname-Spalte sortiert ist, ändert sich u.U. die Position (Zeilennummer) des bearbeiteten DS. Daher wähle ich ihn in solch einem Fall nach dem Schließen des Dialogs wieder aus.
Was bei mir da passiert ist, dass die Zeile (z.B. 3. Zeile) vorm und nach dem Dialog selektiert bleibt. Ist der DS nun auf Position 1 gelandet, wird diese Zeile korrekterweise selektiert. Die 3. Zeile soll aber nicht mehr selektiert sein.
Ich langweile euch damit sicherlich. Das Codebeispiel poste ich dennoch, falls jemand reinschauen will, nur zu.
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
# File: test.py
import wx
import wx.lib.mixins.listctrl as listmix
from wx import ImageFromStream, BitmapFromImage
import cStringIO
#----------------------------------------------------------------------
def getSmallUpArrowData():
return \
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
\x00\x00<IDAT8\x8dcddbf\xa0\x040Q\xa4{h\x18\xf0\xff\xdf\xdf\xffd\x1b\x00\xd3\
\x8c\xcf\x10\x9c\x06\xa0k\xc2e\x08m\xc2\x00\x97m\xd8\xc41\x0c \x14h\xe8\xf2\
\x8c\xa3)q\x10\x18\x00\x00R\xd8#\xec\xb2\xcd\xc1Y\x00\x00\x00\x00IEND\xaeB`\
\x82'
#----------------------------------------------------------------------
def getSmallUpArrowBitmap():
return BitmapFromImage(getSmallUpArrowImage())
#----------------------------------------------------------------------
def getSmallUpArrowImage():
stream = cStringIO.StringIO(getSmallUpArrowData())
return ImageFromStream(stream)
#----------------------------------------------------------------------
def getSmallDnArrowData():
return \
"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
\x00\x00HIDAT8\x8dcddbf\xa0\x040Q\xa4{\xd4\x00\x06\x06\x06\x06\x06\x16t\x81\
\xff\xff\xfe\xfe'\xa4\x89\x91\x89\x99\x11\xa7\x0b\x90%\ti\xc6j\x00>C\xb0\x89\
\xd3.\x10\xd1m\xc3\xe5*\xbc.\x80i\xc2\x17.\x8c\xa3y\x81\x01\x00\xa1\x0e\x04e\
?\x84B\xef\x00\x00\x00\x00IEND\xaeB`\x82"
#----------------------------------------------------------------------
def getSmallDnArrowBitmap():
return BitmapFromImage(getSmallDnArrowImage())
#----------------------------------------------------------------------
def getSmallDnArrowImage():
stream = cStringIO.StringIO(getSmallDnArrowData())
return ImageFromStream(stream)
#----------------------------------------------------------------------
class Liste(wx.ListCtrl,
listmix.ListCtrlAutoWidthMixin,
listmix.ColumnSorterMixin,
listmix.TextEditMixin):
def __init__(
self,
dialog,
panel,
pos=wx.DefaultPosition,
size=(250, 250),
style=wx.LC_REPORT|wx.LC_HRULES|wx.LC_VRULES|wx.LC_SMALL_ICON):
wx.ListCtrl.__init__(self, panel, -1, pos, size, style=wx.LC_REPORT|wx.LC_HRULES|wx.LC_VRULES)
listmix.ListCtrlAutoWidthMixin.__init__(self)
self.il = wx.ImageList(16,16)
self.sm_up = self.il.Add(getSmallUpArrowBitmap())
self.sm_dn = self.il.Add(getSmallDnArrowBitmap())
self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
self.initValues = (
('Müller', 'Michael'),
('Wurst', 'Hans'),
('Huns', 'Kunz'),
('Westernhagen', 'Wuzelfuzel'),
('Adam', 'Eva'),
('Klaus', 'Martin')
)
self.LoadValues()
self.CreateList()
self.FillList()
self.SortListItems(0, True)
#------------------------------------------------------------------------
def GetListCtrl(self):
"""Module wx.lib.mixins.listctrl needs that."""
return self
#------------------------------------------------------------------------
def GetSortImages(self):
"""Module wx.lib.mixins.listctrl needs that."""
return (self.sm_dn, self.sm_up)
#------------------------------------------------------------------------
def CreateList(self):
column_definitions = [['Nachname', wx.ALIGN_RIGHT, 125],
['Vorname', wx.ALIGN_LEFT, 125]]
for colNo, column_definition in enumerate(column_definitions):
column_title = column_definition[0]
align = column_definition[1]
width = column_definition[2]
info = wx.ListItem()
# columns contains text and horizontal orientation can be set
info.m_mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_FORMAT
info.m_format = align
info.m_text = column_title
self.InsertColumnInfo(colNo, info)
self.SetColumnWidth(colNo, width)
listmix.ColumnSorterMixin.__init__(self, self.GetColumnCount())
#------------------------------------------------------------------------
def LoadValues(self):
self.itemDataMap = {}
for no, record in enumerate(self.initValues):
self.itemDataMap.update({no : record})
#------------------------------------------------------------------------
def FillList(self, insert_items=True):
self.DeleteAllItems()
if hasattr(self, 'itemDataMap'):
items = self.itemDataMap.items()
for key, record in items:
if insert_items:
index = self.InsertStringItem(0, str(record[0]))
for col in range(len(record)):
self.SetStringItem(index, col, str(record[col]))
self.SetItemData(index, key)
#------------------------------------------------------------------------
def SelectItems(self, items=[]):
"""items contains the index no. of rows to select."""
if items:
for item in range(self.GetItemCount()):
if item in items:
self.SetItemState(item, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
self.SetItemState(item, wx.LIST_STATE_FOCUSED, wx.LIST_STATE_FOCUSED)
# make top row of items to select visible
toselectItem = items[0]
if type(toselectItem) == type(1) and toselectItem < self.GetItemCount():
self.EnsureVisible(toselectItem)
self.SetFocus()
#------------------------------------------------------------------------
#------------------------------------------------------------------------
class MyFrame(wx.Dialog):
def __init__(self, parent, title):
wx.Dialog.__init__(self, parent, -1, title,
pos=(150, 150), size=(300, 350))
panel = wx.Panel(self, -1)
s = wx.BoxSizer(wx.VERTICAL)
self.list = Liste(self, panel)
self.list.SelectItems([2])
btn = wx.Button(panel, -1, 'Leere und fülle Liste und wähle Zeile 4')
btn.Bind(wx.EVT_BUTTON, self.OnButton)
s.Add(self.list, 0, wx.GROW|wx.ALIGN_CENTRE|wx.ALL, 15)
s.Add(btn, 0, wx.GROW|wx.ALIGN_CENTRE|wx.ALL, 15)
panel.SetSizer(s)
s.Fit(panel)
#------------------------------------------------------------------------
def OnButton(self, event):
self.list.DeleteAllItems()
self.list.LoadValues()
self.list.CreateList()
self.list.FillList()
self.list.SelectItems([3])
event.Skip()
#------------------------------------------------------------------------
class MyApp(wx.App):
def OnInit(self):
dialog = MyFrame(None, "Simple wxPython App")
if dialog.ShowModal() == wx.ID_OK:
print dialog.object.GetDate()
return True
app = MyApp(0)
app.MainLoop()
[/code]