wxPython wx.EVT_LIST_ITEM_SELECTED 点击同一项两次无效

0 投票
2 回答
2408 浏览
提问于 2025-04-17 03:13

我有一段代码,是用来创建一个wxPython面板的,目的是让用户能看到所有的州,但我只想让他们选择(或者勾选)马萨诸塞州或纽约州。当用户点击一次某个州时,wx.EVT_LIST_ITEM_SELECTED这个事件会被触发,这个是正常的。但是如果用户一直点击同一个州,这个事件就不会再被触发了。只有当用户点击了不同的州时,这个事件才会再次被触发。我尝试使用wx.PyEvtHandler来捕捉事件,看看在点击某个项目时发生了什么,但我发现的只有左键点击事件,而这个事件没有GetIndex这个属性。我是不是漏掉了什么事件,导致无法知道用户仍然在同一个列表项上,因此没有触发SELECTED或DESELECTED事件?非常感谢任何帮助。

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)

谢谢!

2 个回答

0

你应该使用鼠标点击事件,而不是选择项目的事件;Mike Driscoll说得对。

0

EVT_LIST_ITEM_SELECTED 这个事件只会在你第一次选择某个项目时触发。也就是说,你不能再次选择已经选中的项目。你可以绑定一个叫 EVT_LEFT_DOWN 的事件,这样当你点击的时候就能获取到鼠标的位置。然后在处理这个事件的代码里,你可以用 myListCtrl.FindItemAtPos() 方法,把鼠标的位置传给它。这样做应该就能实现你想要的效果。

撰写回答