2017-10-11 2 views
0

Vor Phoenix ein editierbares listctrl verwendet, um den bearbeiteten Text über das Ereignis in event.Label zurückgeben.
Mit wxpython 4.0.0b2 (Linux) scheint dies nicht mehr der Fall zu sein. Der Code sollte in event.Item.Text zurückgegeben werden, aber es ist immer leer.Wxpython Phoenix editierbares listctrl nicht in der Lage, auf die geänderten Daten zuzugreifen

Der einzige Weg, die ich gefunden habe von unter Umgehung ist dies den „listctrl.py“ mixin selbst, indem Sie ein zusätzliches Codezeile der CloseEditor Funktion zu bearbeiten, wo ich event.String den veränderten Text zurückzukehren gesetzt und dann Greifen Sie darauf zu, wenn die Bindung ausgelöst wird.
Es wäre besser gewesen, event.Label einzustellen, aber die SetLabel Funktion scheint auf dem Weg verloren gegangen zu sein.

Ich bin mir sicher, dass ich irgendwo etwas verpasst haben muss.
Kurz gesagt, weiß jemand, wie man auf die Bezeichnung, die in der TextEditMixin in Wxpython Phoenix geändert wurde, zugreifen?
Womit ich kämpfe scheint ein EVT_LIST_END_LABEL_EDIT Ereignis ohne Zugriff auf das Etikett selbst zu sein.
Beispielcode:

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() 

Antwort

0

Dies ist ein Fehler entpuppte und wurde in wx.python Fest 4.0.0

Verwandte Themen