2017-10-11 14 views
0

此前鳳凰用來傳遞迴通過該事件的編輯的文本中event.Label可編輯的listctrl。
使用wxpython 4.0.0b2(Linux)這不再是這種情況。
查看代碼,文本應該傳回event.Item.Text,但它總是空白。wxPython的鳳凰編輯的listctrl無法訪問已更改的數據

,我已經找到了繞過這個是編輯「listctrl.py」混入自身的唯一途徑,增加一個額外的代碼行到CloseEditor功能,在這裏我設置event.String返回改變的文本,然後當wx.EVT_LIST_END_LABEL_EDIT綁定被觸發時訪問。
設置event.Label本來會更好,但SetLabel功能似乎一直在丟失。

我覺得我肯定錯過了某個地方的東西。
總之,有沒有人知道如何訪問已在wxpython Phoenix中的TextEditMixin中更改的標籤?
我掙扎的事情似乎是一個EVT_LIST_END_LABEL_EDIT事件,沒有訪問標籤本身。
示例代碼:

import wx 
import wx.lib.mixins.listctrl as listmix 

class EditableListCtrl(wx.ListCtrl, listmix.TextEditMixin): 
    ''' TextEditMixin allows any column to be edited. ''' 

    def __init__(self, parent, ID=wx.ID_ANY, pos=wx.DefaultPosition, 
       size=wx.DefaultSize, style=0): 
     """Constructor""" 
     wx.ListCtrl.__init__(self, parent, ID, pos, size, style) 
     listmix.TextEditMixin.__init__(self) 

class MyPanel(wx.Panel): 

    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.InsertItem(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.text0 = wx.TextCtrl(self, -1, "Ford", size=(50,30)) 
     self.text1 = wx.TextCtrl(self, -1, "Taurus", size=(50,30)) 
     self.text2 = wx.TextCtrl(self, -1, "1996", size=(50,30)) 
     self.text3 = wx.TextCtrl(self, -1, "Blue", size=(50,30)) 
     self.list_ctrl.Select(0) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer2 = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5) 
     sizer2.Add(self.text0, 0, wx.ALL|wx.EXPAND, 5) 
     sizer2.Add(self.text1, 0, wx.ALL|wx.EXPAND, 5) 
     sizer2.Add(self.text2, 0, wx.ALL|wx.EXPAND, 5) 
     sizer2.Add(self.text3, 0, wx.ALL|wx.EXPAND, 5) 
     sizer.Add(sizer2,0,wx.ALL|wx.EXPAND,5) 
     self.SetSizer(sizer) 
     self.list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected) 
     self.list_ctrl.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnMixUpdate) 

    def OnItemSelected(self, event): 
     self.currentItem = event.GetIndex() 
     rowid = self.list_ctrl.GetItem(self.currentItem,0) 
     self.SetData() 
     event.Skip() 

    def SetData(self): 
     rowid = self.list_ctrl.GetItem(self.currentItem,0) 
     self.text0.SetValue(rowid.GetText()) 
     rowid = self.list_ctrl.GetItem(self.currentItem,1) 
     self.text1.SetValue(rowid.GetText()) 
     rowid = self.list_ctrl.GetItem(self.currentItem,2) 
     self.text2.SetValue(rowid.GetText()) 
     rowid = self.list_ctrl.GetItem(self.currentItem,3) 
     self.text3.SetValue(rowid.GetText()) 

    def OnMixUpdate(self, event): 
     self.currentItem = event.GetIndex() 
     rowid = event.GetIndex() 
     new_data = event.GetLabel() 
     new_data2 = event.Item.GetText() 
     colid = event.GetColumn() 
     print ("row,col,new label:",rowid,colid,new_data) 
     print ("2nd attempt:",new_data2) 
     self.list_ctrl.SetItem(rowid,colid,new_data,) 
     #Update the textctrl on screen 
     self.SetData() 
     #Update database 
     #self.OnUpdate(None) 
     event.Skip() 

class MyFrame(wx.Frame): 

    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Editable List Control") 
     panel = MyPanel(self) 
     self.Show() 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 

回答

0

事實證明,這是一個錯誤,並固定在wx.python 4.0.0