gibt es eine Möglichkeit auf einen Spaltennamen eines ListCtrls
zuzugreifen und diesen zu verändern? Ich finde keinen Weg außer
alle Spalten zu löschen und neu zu erzeugen.
EDIT:
Ich habe nun eine Lösung gefunden. Diese ist aber nicht befriedigend, da es zu einer fehlerhaften Darstellung des Spaltenames kommt.
Ich habe ein CheckListCtrlMixin, damit ich eine Checkbox an der linken Seite des Listctrls habe. Wenn ich nur den Spaltennamen(hier nur "Größe") ändere, taucht plätzlich eine Checkbox in Namen auf. Wie kann man das verhindern?
Hier das Code:
Code: Alles auswählen
# -*- coding: utf-8 -*-
import wx, time
from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin
data = [(u'Q:\\Backup\\ap\\CSCDaten1340107.bak', '0.51 GB', '23.09.2011'), (u'Q:\\Backup\\csc\\TestDBCSCDaten.bak', '12.21 GB', '04.10.2011'), (u'Q:\\Backup\\csc\\TestDBCSCStruktur.bak', '6.180 GB', '01.01.2011')]
class MyFrame2 (wx.Frame):
def __init__(self, parent):
wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(520, 300), style = wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE))
bSizer17 = wx.BoxSizer(wx.VERTICAL)
self.m_panel4 = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
bSizer18 = wx.BoxSizer(wx.VERTICAL)
self.m_listCtrl2 = CheckListCtrl(self.m_panel4) # mein CTRL = wx.ListCtrl(self.m_panel4, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LC_ICON)
bSizer18.Add(self.m_listCtrl2, 1, wx.ALL | wx.EXPAND, 5)
self.m_panel4.SetSizer(bSizer18)
self.m_panel4.Layout()
bSizer18.Fit(self.m_panel4)
bSizer17.Add(self.m_panel4, 1, wx.EXPAND | wx.ALL, 5)
self.SetSizer(bSizer17)
self.Layout()
self.Centre(wx.BOTH)
self.itemDataMap = None
self.checkKlickSize = False
self.checkKlickDate = True
self.addCols(self.m_listCtrl2)
self.fillCtrl(data)
self.m_listCtrl2.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClicked)
def addCols(self, ctrl):
"""Fügt die Spalten in das ListCtrl ein
"""
ctrl.InsertColumn(0, 'Pfad', width = 300)
ctrl.InsertColumn(1, 'Größe', wx.LIST_FORMAT_CENTER, width = 80)
ctrl.InsertColumn(2, 'Letzter Zugriff', wx.LIST_FORMAT_CENTER)
def fillCtrl(self, data):
"""Füllt das ListCtrl mit Daten
@param data: Liste mit den Daten für eine Zeile
@type data: List of Tupels [(), ()]
"""
self.m_listCtrl2.DeleteAllItems()
num_items = self.m_listCtrl2.GetItemCount()
counter = 0
for list in data:
index = self.m_listCtrl2.InsertStringItem(num_items, list[0])
self.m_listCtrl2.SetStringItem(num_items, 1, list[1])
self.m_listCtrl2.SetStringItem(num_items, 2, list[2])
self.m_listCtrl2.SetItemData(index, counter)
counter += 1
self.itemDataMap = data
def OnColClicked(self, event):
"""Event wird aufgerufen wenn auf eine Spaltenübershcrift geklickt wurde.
Ist zuständigt für die Sotierung
@param event: Das ist das event
@type event: EVT_MENU
@return: None
"""
col = event.GetColumn()
numOfItems = self.m_listCtrl2.GetItemCount()
if col == 1 and numOfItems > 0:
#self.m_buttonAbwaehlen.SetLabel(chr(118) + ":" + chr(94)) Pfeilzeichen
self.sortSize(self.itemDataMap)
if self.checkKlickSize == True:
col = self.m_listCtrl2.GetColumn(1)
col.SetText(chr(94) + ' Größe')
self.m_listCtrl2.SetColumn(1, col)
self.fillCtrl(self.itemDataMap)
self.checkKlickSize = False
else:
col = self.m_listCtrl2.GetColumn(1)
col.SetText(chr(118) + ' Größe')
self.m_listCtrl2.SetColumn(1, col)
self.itemDataMap.reverse()
self.fillCtrl(self.itemDataMap)
self.checkKlickSize = True
elif col == 2 and numOfItems > 0:
self.sortDate(self.itemDataMap)
if self.checkKlickDate == True:
self.fillCtrl(self.itemDataMap)
self.checkKlickDate = False
else:
self.itemDataMap.reverse()
self.fillCtrl(self.itemDataMap)
self.checkKlickDate = True
else:
event.Skip()
def sortSize(self, seq):
"""Sortiert die Daten für das ListCtrl nach der Datei/Ordnergröße
@param seq: eine Liste mit Werten, die Sortiert werden sollen
@type seq: List
"""
for i in range(len(seq) - 1):
k = i
for j in range(i, len(seq)):
if float(seq[j][1][:-3]) < float(seq[k][1][:-3]):
k = j
seq[i], seq[k] = seq[k], seq[i]
def sortDate(self, seq):
"""Sortiert die Daten für das ListCtrl nach Zugriffsdatum
@param seq: eine Liste mit Werten, die Sortiert werden sollen
@type seq: List
"""
for i in range(len(seq) - 1):
k = i
for j in range(i, len(seq)):
zeit1 = time.mktime((int(seq[j][2][6:]), int(seq[j][2][3:5]), int(seq[j][2][:2]), 0, 0, 0, 0, 0, 0))
zeit2 = time.mktime((int(seq[k][2][6:]), int(seq[k][2][3:5]), int(seq[k][2][:2]), 0, 0, 0, 0, 0, 0))
if zeit1 < zeit2:
k = j
seq[i], seq[k] = seq[k], seq[i]
class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):
def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, -1, style = wx.LC_HRULES | wx.LC_REPORT | wx.LC_VRULES)
CheckListCtrlMixin.__init__(self)
ListCtrlAutoWidthMixin.__init__(self)
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
self.parent = parent
def OnCheckItem(self, index, flag):
if flag:
what = "checked"
else:
what = "unchecked"
def OnItemActivated(self, evt):
self.ToggleItem(evt.m_itemIndex)
class Controller(object):
def __init__(self):
app = wx.PySimpleApp()
self.Frame = MyFrame2 (None)
app.SetTopWindow(self.Frame)
self.Frame.Show()
app.MainLoop()
if __name__ == "__main__":
run = Controller()
Schaf220