wx.ListBox.HitTest在Mac上不工作

问题描述:

以下代码示例在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

如果列表框正在滚动,则没有解决办法。滚动被处理为下面的碳库,滚动位置不准确地通过wx报告。

我发现了wxWidgets源代码中的错误,并在wxWidgets trac上打开了一张票,http://trac.wxwidgets.org/ticket/13699,带有一个补丁。

该错误的根源是调用Mac的基础DataBrowser与不正确的rowId参数。 wxWidgets传递行位置偏移量,假设这将是rowId的(也许在某些时候,苹果公司内部在没有指定真实Id时使用了这些偏移量)。向另一个函数添加调用将行的位置(偏移量)转换为真实ID。使用wxWidgets的补丁版本,上面的脚本按预期工作。