フェニックス以前は、編集可能なlistctrlを使用して、編集されたテキストをevent.Label
のイベントで戻すことができました。
wxpython 4.0.0b2(Linux)を使用すると、これはもはやそのようには見えません。
コードを見ると、テキストはevent.Item.Text
に戻されますが、常に空白です。Wxpython Phoenix editable listctrlが変更されたデータにアクセスできない
これをバイパスして見つけた唯一の方法は、CloseEditor
関数に追加のコード行を追加して、 "listctrl.py" mixin自体を編集することです。変更したテキストを返すように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()