質問
私は、私は別のlistctrlの選択に基づいて変更する値の希望listctrlのリストを配置したい場所のwxPythonを使用して、フォームに取り組んでいます。これを行うには、私は、コールEVT_LIST_ITEM_SELECTED
に制御するオブジェクトのEVT_LIST_ITEM_DESELECTED
とPublisher.sendMessage
イベントにリンクされている方法を使用しています。変更する制御は、その出版社の加入者である方法を有します。この作品:最初listctrlがクリックされた場合、第二が更新されます。
問題は、データがデータベースからリフレッシュしなければならないとのメッセージがすべての選択と選択解除のために送られていることです。私は単に一つの項目をクリックした場合でも、この手段は、データベースが(一度選択解除のために、再度選択のため)を2回照会します。 Iのマルチ選択5つの項目にシフトを押しながらクリックした場合、5つの呼び出しが行われます。むしろ個々の選択よりも、セットにlistctrlの応答を持ってする方法はありますか?
解決
最善の解決策は、正確に一度フォローアップ手順を実行するためにフラグを付けてwx.CallAfter
を使用することのようです
import wx
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.list_ctrl_1 = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_1.Add(self.list_ctrl_1, 1, wx.EXPAND, 0)
self.list_ctrl_1.InsertColumn(0,"1")
self.list_ctrl_1.InsertStringItem(0,"HELLO1")
self.list_ctrl_1.InsertStringItem(0,"HELLO2")
self.list_ctrl_1.InsertStringItem(0,"HELLO3")
self.list_ctrl_1.InsertStringItem(0,"HELLO4")
self.list_ctrl_1.InsertStringItem(0,"HELLO5")
self.list_ctrl_1.InsertStringItem(0,"HELLO6")
self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list_ctrl_1)
self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list_ctrl_1)
self.dirty = False
def Cleanup(self, StringToPrint):
print 'No Longer Dirty!'
self.dirty = False
def OnItemSelected(self,event):
print str(self.__class__) + " - OnItemSelected"
if not self.dirty:
self.dirty = True
wx.CallAfter(self.Cleanup)
event.Skip()
def OnItemDeselected(self,event):
print str(self.__class__) + " - OnItemDeselected"
if not self.dirty:
self.dirty = True
wx.CallAfter(self.Cleanup)
event.Skip()
if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 = MyFrame(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()
他のヒント
あなたはEVT_LIST_ITEM_RIGHT_CLICKを試すことができます。それは動作するはずです。そうしないと、フラグを使用して、データベースを照会したりしないように必要かどうかを確認するためにたびに言っフラグを選択イベント火災を確認したいと思います。 UltimateListCtrl、純粋なPythonのウィジェットは、あなたはおそらく、あまりにもこれを行うにはハックできることもあります。
あなたはカスタムイベントハンドラにプッシュすることができます。
import wx
class MyEventHandler(wx.PyEvtHandler):
def __init__(self,target):
self.target = target
wx.PyEvtHandler.__init__(self)
def ProcessEvent(self,event):
# there must be a better way of getting the event type,
# but I couldn't find it
if event.GetEventType() == wx.EVT_LEFT_DOWN.evtType[0]:
print "Got Mouse Down event"
(item,where) = self.target.HitTest(event.GetPosition())
if item != -1:
print self.target.GetItem(item,0).GetText()
print where
else:
print "Not on list item though"
return True
else:
return False
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.list_ctrl_1 = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
self.myevthandler = MyEventHandler(self.list_ctrl_1)
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_1.Add(self.list_ctrl_1, 1, wx.EXPAND, 0)
self.list_ctrl_1.InsertColumn(0,"1")
self.list_ctrl_1.InsertStringItem(0,"HELLO1")
self.list_ctrl_1.PushEventHandler(self.myevthandler)
if __name__ == "__main__":
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_1 = MyFrame(None, -1, "")
app.SetTopWindow(frame_1)
frame_1.Show()
app.MainLoop()