2016-11-09 5 views
0

Wenn ich eine wx.ListCtrl erstelle und ein Mixin benutze, um es zu bearbeiten, wie bekomme ich die Daten von der Zelle, die geändert wurde? Bisher habe ich den Code unten. Wenn ich versuche, es zu drucken/in einer Variablen zu speichern, ist es leer.Daten von wx.ListCtrl nach einer Bearbeitung abrufen

def __init__(self, parent): 
    """Constructor""" 
    wx.Panel.__init__(self, parent) 

    rows = [("Ford", "Taurus", "1996", "Blue"), 
      ("Nissan", "370Z", "2010", "Green"), 
      ("Porche", "911", "2009", "Red") 
      ] 
    self.list_ctrl = EditableListCtrl(self, style=wx.LC_REPORT) 

    self.list_ctrl.InsertColumn(0, "Make") 
    self.list_ctrl.InsertColumn(1, "Model") 
    self.list_ctrl.InsertColumn(2, "Year") 
    self.list_ctrl.InsertColumn(3, "Color") 

    index = 0 
    for row in rows: 
     self.list_ctrl.InsertStringItem(index, row[0]) 
     self.list_ctrl.SetItem(index, 1, row[1]) 
     self.list_ctrl.SetItem(index, 2, row[2]) 
     self.list_ctrl.SetItem(index, 3, row[3]) 
     index += 1 
    self.list_ctrl.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnUpdate) 
    sizer = wx.BoxSizer(wx.VERTICAL) 
    sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
    self.SetSizer(sizer) 

def OnUpdate(self, event): 
    row_id = event.GetIndex() #Get the current row 
    col_id = event.GetColumn() #Get the current column 
    new_data = event.GetText() #Get the changed data 
    print new_data 
    cols = self.list_ctrl.GetColumnCount() #Get the total number of columns 
    rows = self.list_ctrl.GetItemCount() #Get the total number of rows 

    #Get the changed item use the row_id and iterate over the columns 
    print (" ".join([self.list_ctrl.GetItem(row_id, colu_id).GetText() for colu_id in range(cols)])) 
    print "Changed Item:", new_data, "Column:", col_id 

    #Get the entire listctrl iterate over the rows and the columns within each row 
    print "\nEntire listctrl BEFORE the update:" 
    for row in range(rows): 
     row_data = (" ".join([self.list_ctrl.GetItem(row, col).GetText() for col in range(cols)])) 
     print row_data 

    #Set the new data in the listctrl 
    self.list_ctrl.SetItem(row_id,col_id,new_data) 

    print "\nEntire listctrl AFTER the update:" 
    #Create a list that can be used to export data to a file 
    data_for_export=[] 
    for row in range(rows): 
     row_data = (" ".join([self.list_ctrl.GetItem(row, col).GetText() for col in range(cols)])) 
     print row_data 
     data_for_export.append(row_data) #Add to the exportable data 

    print "\nData for export" 
    for row in data_for_export: #Print the data 
     print row 

Die bind ist als solche:

self.list_ctrl.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnUpdate) 

enter image description here

Als Beispiel lassen Sie uns sagen, ich will 'Blue' in 'Yellow' bearbeiten.

+1

zeigt kleines Arbeitsbeispiel. Welches Ereignis binden Sie? – furas

+0

Oh ja, tut mir leid. Da gehst du. – javanewbie

Antwort

2

Sie mit event.GetText() der Nähe sind, versuchen event.GetLabel() statt und dann vergessen Sie nicht event.Skip()

Update rufen OP Mindestarbeits Code zu reflektieren:

Ich habe nicht den Code haben für Ihre EditableListCtrl aber ich habe ein funktionierendes Beispiel mit dem, wie ich vermute, dass Ihr Code aussehen könnte, zur Verfügung gestellt. Zu Ihrer Frage über das Erhalten der Auswahl können Sie das vorgewählte Einzelteil erhalten (welches der Gegenstand sein sollte, den Sie bearbeiten), indem Sie list_control.GetFirstSelected() anrufen und von diesem können Sie GetItemText anrufen. Ohne den EditableListCtrl Code zu sehen, würde ich annehmen, dass Ihr Problem von einem Ereignis herrührt, das irgendwo anders erwischt wird und ein Veto eingelegt wird. Aber das ist nur eine Vermutung. Hier

ist ein Mindestarbeits Code mit dem, was ich nehme an EditableListCtrl sieht aus wie

import wx 
from wx.lib.mixins.listctrl import TextEditMixin 

class EditableListCtrl(wx.ListCtrl, TextEditMixin): 
    def __init__(self, *args, **kw): 
     wx.ListCtrl.__init__(self, *args, **kw) 
     TextEditMixin.__init__(self) 


class MainFrame(wx.Frame): 
    def __init__(self, parent=None): 
     wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, 
          size=wx.Size(762, 347), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) 

     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 

     main_sizer = wx.BoxSizer(wx.VERTICAL) 

     self.main_panel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL) 
     panel_sizer = wx.BoxSizer(wx.VERTICAL) 

     self.list_ctrl = EditableListCtrl(self.main_panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 
            wx.LC_EDIT_LABELS | wx.LC_REPORT) # ---- Changed ------ 
     panel_sizer.Add(self.list_ctrl, 1, wx.ALL | wx.EXPAND, 5) 

     self.main_panel.SetSizer(panel_sizer) 
     self.main_panel.Layout() 
     panel_sizer.Fit(self.main_panel) 
     main_sizer.Add(self.main_panel, 1, wx.EXPAND, 5) 

     self.SetSizer(main_sizer) 
     self.Layout() 

     self.Centre(wx.BOTH) 

     self.list_ctrl.InsertColumn(0, "Make") 
     self.list_ctrl.InsertColumn(1, "Model") 
     self.list_ctrl.InsertColumn(2, "Year") 
     self.list_ctrl.InsertColumn(3, "Color") 

     rows = [("Ford", "Taurus", "1996", "Blue"), 
       ("Nissan", "370Z", "2010", "Green"), 
       ("Porche", "911", "2009", "Red") 
       ] 
     index = 0 
     for row in rows: 
      self.list_ctrl.InsertStringItem(index, row[0]) 
      self.list_ctrl.SetStringItem(index, 1, row[1]) # ---- Changed ------ 
      self.list_ctrl.SetStringItem(index, 2, row[2]) # ---- Changed ------ 
      self.list_ctrl.SetStringItem(index, 3, row[3]) # ---- Changed ------ 
      index += 1 
     self.list_ctrl.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnUpdate) 




    def OnUpdate(self, event): 
     self.list_ctrl.Select(event.Item.Id) # force the list to select the event item 
     row_id = event.GetIndex() #Get the current row 
     col_id = event.GetColumn() #Get the current column 
     if col_id < 0: # ---- Changed ------ 
      col_id = 0 # ---- Changed ------ 
     new_data = event.GetText() #Get the changed data 
     print new_data 
     cols = self.list_ctrl.GetColumnCount() #Get the total number of columns 
     rows = self.list_ctrl.GetItemCount() #Get the total number of rows 


     #Get the changed item use the row_id and iterate over the columns 
     print (" ".join([self.list_ctrl.GetItem(row_id, colu_id).GetText() for colu_id in range(cols)])) 
     print "Changed Item:", new_data, "Column:", col_id 

     #Get the entire listctrl iterate over the rows and the columns within each row 
     print "\nEntire listctrl BEFORE the update:" 
     for row in range(rows): 
      row_data = (" ".join([self.list_ctrl.GetItem(row, col).GetText() for col in range(cols)])) 
      print row_data 

     #Set the new data in the listctrl 
     self.list_ctrl.SetStringItem(row_id,col_id,new_data) 

     print "\nEntire listctrl AFTER the update:" 
     #Create a list that can be used to export data to a file 
     data_for_export=[] 
     for row in range(rows): 
      row_data = (" ".join([self.list_ctrl.GetItem(row, col).GetText() for col in range(cols)])) 
      print row_data 
      data_for_export.append(row_data) #Add to the exportable data 

     print "\nData for export" 
     for row in data_for_export: #Print the data 
      print row 

try: 
    app = wx.App() 
    frame = MainFrame() 
    frame.Show() 
    app.MainLoop() 
except Exception: 
    from traceback import format_exc 
    print(format_exc()) 
    raw_input("") 

Edit # 2 aufgrund einiger Unterschiede zwischen den wx Installationen eine andere Lösung umgesetzt wurde. Changed OnUpdate Verfahren und hinzugefügt after_edit_event Methode

def OnUpdate(self, event): 
    event.Skip() 
    wx.CallAfter(self.after_edit_event) 

def after_edit_event(self): 
    rows = self.list_ctrl.GetItemCount() 
    cols = self.list_ctrl.GetColumnCount() 

    for row in range(rows): 
     print(", ".join([self.list_ctrl.GetItem(row, col).GetText() for col in range(cols)])) 
+0

Es funktioniert nicht. Wenn ich es tue und versuche, 'neue_Daten' zu drucken, wird nichts gedruckt. :/ – javanewbie

+0

schwer zu sagen, ohne den gesamten Code zu sehen. Alternativ könnten Sie die Auswahl erhalten und dann den Artikeltext erhalten. – user2682863

+0

Code angewendet, bitte sehen Sie. :) Und was meinst du mit Auswahl? (Sorry, ich bin relativ neu zu wxPython) – javanewbie

Verwandte Themen