2011-11-21 6 views
2

다음 코드 샘플은 Linux (우분투) 및 Windows XP에서 작동하지만 OSX에서는 작동하지 않습니다.wx.ListBox.HitTest가 Mac에서 작동하지 않습니다

import wx 
class frame(wx.Frame): 
    def __init__(self,p=None): 
     wx.Frame.__init__(self,p) 
     self.box = wx.ListBox(self) 
     self.box.AppendItems(["Zero","One","Two","Three","Four","Five","Six"]) 
     self.box.Bind(wx.EVT_MOUSE_EVENTS,self.onMouse) 
    def onMouse(self,evt): 
     pos = evt.GetPosition() 
     print self.box.HitTest(pos) 
     evt.Skip() 
class guiApp(wx.App): 
    def __init__(self,redirect=False): 
     wx.App.__init__(self,redirect) 
    def OnInit(self): 
     f = frame() 
     f.Show() 
     self.SetTopWindow(f) 
     return True 
if __name__=="__main__": 
    app = guiApp() 
    app.MainLoop() 

Linux 및 Windows의 경우 마우스를 올리면 올바른 항목이 식별됩니다. OSX hittest는 항상 -1 (wx.NOT_FOUND)을 반환합니다.

저는 32 비트 파이썬 2.7.2에서 Carbon API를 사용하는 32 비트 wxPython, 2.8.12.1 (mac-unicode)를 실행하고 있습니다.

wxWidgets의 알려진 버그로이 목록을 찾을 수 없으며 제대로 작동 할 것입니다. 제출하는 것을 주저합니다. 목록 상자 컨트롤은 GUI에 깊숙이 통합되어 있으므로 ListCtrl 또는 다른 모든 기능을 지금 사용하고있는 것과 비슷한 것으로 바꾸고 싶지 않습니다. 누구나 해결 방법을 알고 있습니까?

+0

유스 케이스는 드래그 앤 드롭을위한 것입니다. 하나의 목록 상자에서 다른 항목으로 끌어서 놓기를 원합니다. 두 번째 목록 상자에 항목을 놓을 때 올바른 위치 (놓을 항목 위에)에 삽입하려고합니다. 또한 목록 상자의 재정렬을 지원하기를 원합니다. – Charles

+0

무엇을하려고합니까? 어떤 항목이 선택되었는지 알려주십시오. wx.EVT_LISTBOX가 이런 종류의 일에 더 좋지 않을까요? –

+0

친구가 wxWidgets (C++)에서이 테스트를 반복하고 동일한 결과를 발견했습니다. 그는 wxWidgets 2.9.2를 사용하고있었습니다. 이 문제는 wxWidgets 라이브러리 자체의 버그 인 것 같습니다. – Charles

답변

1

목록 상자가 스크롤되는 경우 아무런 해결 방법이 없습니다. 스크롤은 기본 Carbon 라이브러리로 처리되고 스크롤 위치는 wx를 통해 정확하게보고되지 않습니다.

wxWidgets 소스 코드에서 버그를 발견하고 패치가 포함 된 wxWidgets trac (http://trac.wxwidgets.org/ticket/13699) 티켓을 열었습니다.

버그의 루트는 잘못된 rowId 인수와 함께 Mac의 기본 DataBrowser에 대한 호출입니다. wxWidgets가 행 위치 오프셋을 전달하면서 rowId라고 가정합니다 (실제로 ID가 지정되지 않은 경우 Apple에서 내부적으로이 점을 사용했습니다). 다른 함수에 대한 호출을 추가하면 행의 위치 (오프셋)가 실제 ID로 변환됩니다. wxWidgets의 패치 버전에서는 위의 스크립트가 예상대로 작동합니다.

관련 문제