Wxpython 在wxListBox中至少保留一个选定项

Wxpython 在wxListBox中至少保留一个选定项,wxpython,wxwidgets,Wxpython,Wxwidgets,我有一个多重选择wxListBox,我想保持列表中至少有一个项目被选中的条件。我试着 def OnSelectDataSource(self, event): datasourcelist = xrc.XRCCTRL(self, "m_lstDataSource") if not event.IsSelection(): if len(datasourcelist.GetSelections()) == 0: datasourcelist.

我有一个多重选择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\u列表框
事件的处理程序。这是可行的,但您可以看到该项目被取消选择,然后重新选择。也许有一个更好的方法我不知道

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


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

xrc.XRCCTRL(self, "m_lstDataSource").Bind(wx.EVT_LEFT_DOWN, self.CheckDataSelect)
在我的
\uuuu init\uuuu
方法和

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()

要防止进行中的更改可见,请执行以下操作:

wxWindow::冻结 虚拟无效冻结()

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


此方法对于视觉外观优化非常有用(例如,在wxGTK下将一行中的许多大文本插入WXTXTCTRL之前使用此方法是一个好主意)但并非在所有平台上或所有控件上都实现,因此它主要只是对wxWidgets的提示,而不是强制指令。

为了防止在进行过程中看到更改:

wxWindow::冻结 虚拟无效冻结()

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


此方法对于视觉外观优化非常有用(例如,在wxGTK下将一行中的许多大文本插入WXTXTCTRL之前使用此方法是一个好主意)但并不是在所有平台上或所有控件上都实现,因此它主要只是对wxWidgets的提示,而不是强制指令。

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


捕获鼠标向上移动事件,并检查是否会使选择变为“无项目”。如果是这样,请调用event.skip()以防止其他处理程序接触您的选择


datasourcelist.Freeze()
datasourcelist.Thaw()
放在处理程序函数体中的代码周围不会停止可见的取消选择和重新选择。将
datasourcelist.Freeze()和
datasourcelist.Thaw()放在
在我的处理程序函数体中的代码周围,不会停止可见的取消选择和重新选择。这是有效的,尽管我需要挂起鼠标,而不是挂起鼠标事件。这是有效的,尽管我需要挂起鼠标,而不是挂起鼠标事件。