保持在wxListBox中至少选择一个项目

时间:2011-02-24 20:53:27

标签: wxpython wxwidgets

我有多个选择wxListBox,我想保持条件,即列表中至少有一个项目被选中。我试过

def OnSelectDataSource(self, event):
    datasourcelist = xrc.XRCCTRL(self, "m_lstDataSource")
    if not event.IsSelection():
        if len(datasourcelist.GetSelections()) == 0:
            datasourcelist.Select(event.GetInt())

作为wx.EVT_LISTBOX事件的处理程序。这有效,但您可以看到该项目被取消选择然后重新选择。可能有一种我不知道的更好的方法。

取消选择似乎是在鼠标按下时发生的,并且直到鼠标按下(然后重新选择该项目)才会调用该事件。


根据建议的解决方案,我现在可以使用

xrc.XRCCTRL(self, "m_lstDataSource").Bind(wx.EVT_LEFT_DOWN, self.CheckDataSelect)

在我的__init__方法和

def CheckDataSelect(self, event):
    lstctrl = xrc.XRCCTRL(self, "m_lstDataSource")
    pos = lstctrl.HitTest(event.GetPosition())
    if lstctrl.GetSelections() == (pos,):
        event.Skip(False)
    else:
        event.Skip()

2 个答案:

答案 0 :(得分:0)

防止在进行中看到更改:

wxWindow的::冷冻 virtual void Freeze()

冻结窗口,换句话说,防止在屏幕上发生任何更新,窗口根本不会重绘。必须调用解冻以重新启用窗口重绘。可以嵌套对这两个函数的调用。

此方法对于视觉外观优化非常有用(例如,在连续执行大量文本插入到wxGTK下的wxTextCtrl之前使用它是一个好主意),但并未在所有平台上实现,也未在所有控件上实现,因此它主要只是对wxWidgets的暗示,而不是强制性指令。

答案 1 :(得分:0)

捕获鼠标按下事件并进行检查以确定是否会使选择变为无项目。如果是这样,请调用event.skip()以防止其他处理程序触及您的选择。

http://www.wxpython.org/docs/api/wx.Event-class.html#Skip