Halli Hallo, ich hatte zu genau zu diesem Thema mal ein kleines
Projekt. Hier mal der Code mit ein paar Kommentaren.
Ein Gemisch aus eigenem Code und der WX Demo die nicht
alle Infos bot, die ich brauchte.
Was zeigt das Script?
Eine ListCtrl das auf einem Panel liegt. DIeses liegt auf einem Frame.
Die ListCtrl bekommt in 2 Spalten einträge. Diese lassen sich
beide ordnen. Es gibt eine Farbunterscheidung und das Ändern der Größe
der Spalten wird unterbunden. Klick, Doppelklick und Rechtsklick
Events werden abgefangen.
Code: Alles auswählen
import wx, sys
import wx.lib.mixins.listctrl as listmix
ID_LISTCTRL = wx.NewId()
musicdata = {
1 : ("Bad English", "The Price Of Love", "Rock"),
2 : ("DNA featuring Suzanne Vega", "Tom's Diner", "Rock"),
3 : ("George Michael", "Praying For Time", "Rock"),
4 : ("Gloria Estefan", "Here We Are", "Rock"),
5 : ("Linda Ronstadt", "Don't Know Much", "Rock"),
6 : ("Michael Bolton", "How Am I Supposed To Live Without You", "Blues"),
7 : ("Paul Young", "Oh Girl", "Rock"),
8 : ("Paula Abdul", "Opposites Attract", "Rock"),
9 : ("Richard Marx", "Should've Known Better", "Rock"),
}
class Gui(wx.Frame, listmix.ColumnSorterMixin):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'Test', (300,300), (240, 300), style=wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
panel = wx.Panel(self, -1)
# Online/Offline Dictionary
self.operations = {}
#Aufruf der ListCtrl Klasse
#zum Darstellen der Friendsliste
self.list = TestListCtrl(panel, ID_LISTCTRL, style=wx.LC_REPORT #| wx.BORDER_SUNKEN
| wx.BORDER_NONE #| wx.LC_EDIT_LABELS
| wx.LC_VRULES #| wx.LC_SORT_ASCENDING
| wx.LC_HRULES | wx.LC_SINGLE_SEL
)
self.itemDataMap = {}
listmix.ColumnSorterMixin.__init__(self, 3)
#Benennung der Header
self.list.InsertColumn(0, "Spalte 1")
self.list.InsertColumn(1, "Spalte 2")
self.list.SetColumnWidth(0, 170)
self.list.SetColumnWidth(1, 48)
self.column = -1
#Bindings
self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.item_select, id=ID_LISTCTRL)
self.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self.column_drag, id=ID_LISTCTRL)
self.Bind(wx.EVT_LIST_COL_CLICK, self.column_click, id=ID_LISTCTRL)
self.list.Bind(wx.EVT_LEFT_DCLICK, self.on_double_click)
self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.on_right_click)
self.insertUsersIntoListCtrl()
def insertUsersIntoListCtrl(self):
#Daten in die ListCtrl einfuegen
items = musicdata.items()
for key, data in items:
index = self.list.InsertImageStringItem(sys.maxint, data[0], 0)
self.list.SetStringItem(index, 1, data[1])
self.list.SetItemData(index, key)
#Farbunterscheidung von Eintraegen
length = self.list.GetItemCount()
for x in range(length):
if self.list.GetItem(x, 1).GetText() == "BLAU":
self.list.SetItemTextColour(x, wx.BLUE)
else:
self.list.SetItemTextColour(x, wx.RED)
#Methoden zum Ordnen der ListCtrl
def column_click(self, event):
lastColumn = self.column
self.column = event.m_col
if self.column == lastColumn:
temp = self.lower
self.lower = self.higher
self.higher = temp
else:
self.lower = -1
self.higher = 1
self.list.SortItems(self.column_sorter)
def column_sorter(self, key1, key2):
data1 = musicdata[key1]
data2 = musicdata[key2]
if data1 == data2:
return 0
elif data1 < data2:
return self.lower
else:
return self.higher
#Pflichtmethode der ColumnSorterMixin Klasse
def GetListCtrl(self):
return self
#Methoden der Click Events
def item_select(self, event):
self.currentItem = event.m_itemIndex
print "Ausgewaehlt wurde Eintrag Nummer " + str(self.currentItem) + \
" mit dem Inhalt " + self.list.GetItem(self.currentItem, 0).GetText()
def on_double_click(self, event):
print "DOPPELKLICK"
def on_right_click(self, event):
print "Rechtsklick"
#Verhindert das Veraendern der Groesse der Spalten
def column_drag(self, event):
print "Es wird versucht, die Groesse der Spalten \
zu aendern... Event kann mit event.Veto() fuer \
die jeweilige Spalte abgefangen werden"
if event.GetColumn() == 0 or event.GetColumn() == 1:
event.Veto()
class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
def __init__(self, parent, ID, pos=(0,0), size=(234,300), style=0):
wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
listmix.ListCtrlAutoWidthMixin.__init__(self)
class TestClass(wx.App):
def OnInit(self):
gui = Gui()
gui.Show()
return True
if (__name__ == '__main__'):
app = TestClass(False)
app.MainLoop()
Gruss prosta