2011-09-27 27 views
0

wxPythonパネルの下に、すべての状態を表示しようとしているコードがありますが、またはチェックしてください)。これは、wx.EVT_LIST_ITEM_SELECTEDイベントが呼び出されるため、ユーザーがその状態で1回クリックすると機能しますが、同じ状態をクリックし続けると、このイベントは呼び出されません。ユーザーが別の状態をクリックした場合にのみ再度呼び出されます。私はwx.PyEvtHandlerを使ってイベントをキャプチャし、アイテムをクリックするとどのイベントが発生するのかを調べてみましたが、一貫してGetIndex属性を持たないマウスの左クリックイベントしか表示されません。ユーザーが同じリストアイテムにいて、SELECTEDまたはDESELECTEDのいずれも呼び出していないことを伝えているイベントがありませんか?どんな助けでも大歓迎です。wxPython wx.EVT_LIST_ITEM_SELECTED同じ項目を2回クリックすると動作しない

import wx,wx.grid, ExampleImages #legend images 
from ObjectListView import GroupListView, ColumnDefn, ObjectListView 
class NEWLIST(wx.Panel): 
"""Create a new information panel""" 
def __init__(self, parent, INFOB): 
    wx.Panel.__init__(self, size=(-1, 460), parent=parent, id=wx.ID_ANY) 
    self.dataOlv = GroupListView(self, wx.ID_ANY, style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
    self.dataOlv.useExpansionColumn = True 
    #---------------------------------------------------------------------- 
    myimgsdict = {} 
    def myImageGetter(item): 
     k = item.code.capitalize() 
     myimgsdict[item.code] = self.dataOlv.AddImages(eval("ExampleImages.get%s16Bitmap()"%k)) 
     if item in INFOB.list.dataOlv.GetCheckedObjects() and item.code in ('MA','NY'): 
      return myimgsdict[item.code] 
    #---------------------------------------------------------------------- 
    self.statacolumn = ColumnDefn("Country", "left", 130, "state", useInitialLetterForGroupKey=True,isSpaceFilling=True) 
    self.legendcolumn = ColumnDefn("" , "left", 16, "legend" , imageGetter=myImageGetter) 
    self.totalcolumn = ColumnDefn("Total" , "right", 70, "total") 
    self.inviscolumn = ColumnDefn("" , "right", 0, "region") 

    self.dataOlv.SetColumns([self.statecolumn, self.legendcolumn, self.totalcolumn, self.inviscolumn]) 
    self.dataOlv.InstallCheckStateColumn(self.statecolumn) 
    self.dataOlv.SetSortColumn(self.dataOlv.columns[2]) 
    #---------------------------------------------------------------------- 
    # Create some sizers 
    mainSizer = wx.BoxSizer(wx.VERTICAL) 
    mainSizer.Add(self.dataOlv, 1, wx.ALL|wx.EXPAND, 5) 
    self.SetSizer(mainSizer) 
    #---------------------------------------------------------------------- 
    def OnItemSelected(event): 
     """Action for when item is seleted by the user""" 
     realIndex = INFOB.list.dataOlv[event.GetIndex()] 
     if realIndex.code not in ('MA','NY'): 
      self.dataOlv.Uncheck(realIndex) 
    #---------------------------------------------------------------------- 
    self.dataOlv.Bind(wx.EVT_LIST_ITEM_SELECTED, OnItemSelected) 
    self.dataOlv.Bind(wx.EVT_LIST_ITEM_ACTIVATED, OnItemSelected) 
    #self.dataOlv.Bind(wx.EVT_COMMAND_LEFT_CLICK, OnItemSelected) 
    self.dataOlv.Bind(wx.EVT_LIST_ITEM_DESELECTED, OnItemSelected) 
    self.dataOlv.Bind(wx.EVT_LIST_CACHE_HINT, OnItemSelected) 

ありがとう!

答えて

0

EVT_LIST_ITEM_SELECTEDは、アイテムが最初に選択されたときにのみ起動されます。すでに選択されている項目は選択できません。 EVT_LEFT_DOWNにバインドして、マウスの位置を取得できます。ハンドラでは、myListCtrl.FindItemAtPos()を使用して、その位置を渡します。そのようなものはうまくいくはずです。

0

アイテム選択イベントではなくマウスクリックイベントを使用することをお勧めします。 Mike Driscollが正しいです。

関連する問題