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