2017-10-11 82 views
0

フェニックス以前は、編集可能な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() 

答えて

0

これはバグであることが判明し、wx.python 4.0.0

に固定しました
関連する問題