2011-02-24 3 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 이벤트의 처리기로. 이 방법은 효과적이지만 항목을 선택 해제 한 다음 다시 선택하는 것을 볼 수 있습니다. 아마 내가 모르는 더 나은 방법이있을 것입니다.

마우스 누르기를 할 때 선택 취소가 발생했으며 마우스를 위로 올리면 항목이 다시 선택 될 때까지 이벤트가 호출되지 않습니다. 제안 된 솔루션을 기반으로


, 지금 내 __init__ 방법에

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

함께 작업하고

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

0

변경 볼 것을 방지하기 위해 진행하는 동안 :

wxWindow :: Freeze 가상 보이드 Freeze()

화면을 정지 시키거나, 화면에 업데이트가 일어나지 못하도록하면, 창은 전혀 그려지지 않습니다. 창 다시 그리기를 다시 활성화하려면 Thaw를 호출해야합니다. 이 두 함수에 대한 호출은 중첩 될 수 있습니다.

이 방법은 시각적 모양 최적화에 유용합니다 (예를 들어 wxGTK에서 wxTextCtrl에 많은 대용량 텍스트를 삽입하기 전에 사용하는 것이 좋음). 그러나 모든 플랫폼이나 모든 컨트롤에 구현되지는 않습니다 그래서 대부분 wxWidgets에 대한 힌트 일 뿐이지 만 필수 지시어는 아닙니다.

+0

퍼팅'datasourcelist.Freeze()'와'datasourcelist.Thaw()'내 핸들러 함수의 본문에 코드 주위에 정지하지 않는 볼 수 unselection 및 재 선택. – tkerwin

관련 문제