我有多个选择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()
答案 0 :(得分:0)
防止在进行中看到更改:
wxWindow的::冷冻 virtual void Freeze()
冻结窗口,换句话说,防止在屏幕上发生任何更新,窗口根本不会重绘。必须调用解冻以重新启用窗口重绘。可以嵌套对这两个函数的调用。
此方法对于视觉外观优化非常有用(例如,在连续执行大量文本插入到wxGTK下的wxTextCtrl之前使用它是一个好主意),但并未在所有平台上实现,也未在所有控件上实现,因此它主要只是对wxWidgets的暗示,而不是强制性指令。
答案 1 :(得分:0)
捕获鼠标按下事件并进行检查以确定是否会使选择变为无项目。如果是这样,请调用event.skip()以防止其他处理程序触及您的选择。