2011-02-24 55 views
2

我有一個多選wxListBox,我想保持條件,至少有一個列表中的項目被選中。我試過在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

捕獲鼠標向上事件,並做你的檢查,看看這是否會使選擇沒有項目。如果是這樣,請調用event.skip()以防止更多的處理程序觸摸您的選擇。

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

+0

這工作,雖然我需要鉤住鼠標,而不是鼠標事件。 – tkerwin 2011-03-10 22:36:21

0

以防止更改是可見的,而在進步:

wxWindow :: Freeze virtual void Freeze()

凍結窗口,換句話說,防止屏幕上發生任何更新,窗口根本不會重新繪製。必須調用解凍來重新啓用窗口重繪。對這兩個函數的調用可以嵌套。

此方法對視覺外觀優化很有用(例如,在將wxTextCtrl中的許多大型文本插入到wxGTK中之前使用它是個好主意),但並未在所有平臺上實現,也未在所有控件上實現所以它主要只是提示wxWidgets而不是強制指令。

+0

把'datasourcelist.Freeze()'和'datasourcelist.Thaw()'圍繞在我的處理函數體內的代碼不會停止可見去除選擇和重選。 – tkerwin 2011-02-24 22:00:36