2011-11-21 93 views
2

以下代碼示例在linux(ubuntu)和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的測試總是返回-1(wx.NOT_FOUND)

我正在運行32位wxPython,2.8.12.1(mac-unicode),它使用32bit Python 2.7.2中的Carbon API。

我找不到這個列爲wxWidgets中的已知錯誤,我很猶豫要提交,因爲看起來這應該起作用。列表框控件深入集成到GUI中,我真的不想將它交換爲ListCtrl或類似的東西,因爲我們現在有所有其他功能。有誰知道解決方法?

+0

用例用於拖放。我想將項目從一個列表框拖放到另一個列表框中,當我將該項目拖放到第二個列表框上時,我想將其插入到正確的位置(放在它上面的項目上方)。我也想支持列表框的重新排序。 – Charles

+0

你想做什麼?告訴選擇哪個項目? wx.EVT_LISTBOX會不會比這更好? –

+0

我有一個朋友在wxWidgets(C++)中重複這個測試,他發現了相同的結果。他使用的是wxWidgets 2.9.2。這個問題似乎是wxWidgets庫自身的一個錯誤。 – Charles

回答

1

如果列表框正在滾動,則沒有解決辦法。滾動被處理爲下面的碳庫,滾動位置不準確地通過wx報告。

我發現了wxWidgets源代碼中的錯誤,並在wxWidgets trac上打開了一張票,http://trac.wxwidgets.org/ticket/13699,帶有一個補丁。

該錯誤的根源是調用Mac的基礎DataBrowser與不正確的rowId參數。 wxWidgets傳遞行位置偏移量,假設這將是rowId的(也許在某些時候,蘋果公司內部在沒有指定真實Id時使用了這些偏移量)。向另一個函數添加調用將行的位置(偏移量)轉換爲真實ID。使用wxWidgets的補丁版本,上面的腳本按預期工作。