2016-11-09 2 views
0

Если я создаю wx.ListCtrl и использую mixin, позволяющий мне его редактировать, как мне получить данные из ячейки, которая была изменена? Пока у меня есть код ниже. Когда я пытаюсь распечатать его/сохранить в переменной, он пуст.Получение данных из wx.ListCtrl после редактирования

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 

Привязать как таковой:

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

enter image description here

В качестве примера, скажем, я хочу, чтобы изменить 'Blue' в 'желтый'.

+1

показать небольшое рабочий пример. Какое событие вы связываете? – furas

+0

О да, прости. Вот так. – javanewbie

ответ

2

вы близки с event.GetText(), попробуйте event.GetLabel() вместо, а затем не забудьте позвонить event.Skip()

Update, чтобы отразить OP минимальный рабочий код:

У меня нет кода для EditableListCtrl, но я представил рабочий пример с тем, что, как я предполагаю, может выглядеть ваш код. На ваш вопрос о получении выбора вы можете получить выбранный элемент (который должен быть элементом, который вы редактируете), вызвав list_control.GetFirstSelected() и из которого вы можете позвонить GetItemText. Не видя кода EditableListCtrl, я бы предположил, что ваша проблема связана с событием, которое попадает в другое место и налагается вето. Но это всего лишь предположение.

Вот некоторый минимальный рабочий код с тем, что я предполагаю, что EditableListCtrl выглядит

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 из-за некоторые различия между WX установками внедренной другим решением. Измененный OnUpdate метод и метод добавлен after_edit_event

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

Это не работает. Когда я это делаю и пытаюсь напечатать 'new_data', он ничего не печатает. :/ – javanewbie

+0

сложно сказать, не видя всего кода. В качестве альтернативы вы можете получить выделение, а затем получить текст элемента. – user2682863

+0

Применяемый код, пожалуйста, посмотрите. :) И что вы имеете в виду под выбор? (Извините, я относительно новичок в wxPython) – javanewbie