Spaltennamen von einem ListCtrl ändern?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Hallo liebe Community,
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()

Mit freundlichen Grüßen
Schaf220
Antworten