【问题标题】:Keeping at least one item selected in a wxListBox在 wxListBox 中保持至少一项被选中
【发布时间】:2023-03-03 00:48:02
【问题描述】:

我有一个多选 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()

【问题讨论】:

    标签: wxpython wxwidgets


    【解决方案1】:

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

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

    【讨论】:

    • 这行得通,虽然我需要钩住鼠标,而不是鼠标向上事件。
    【解决方案2】:

    为了防止更改在进行中可见:

    wxWindow::冻结 虚空冻结()

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

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

    【讨论】:

    • datasourcelist.Freeze()datasourcelist.Thaw() 放在我的处理函数主体中的代码周围并不会阻止可见的取消选择和重新选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2016-07-03
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多