wx.ListBox.HitTest无法在Mac上运行

时间:2011-11-21 20:18:09

标签: python cross-platform wxpython wxwidgets

以下代码示例适用于linux(ubuntu)和Windows XP,但不适用于OSX。

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位wxPython,2.8.12.1(mac-unicode),它使用32位python 2.7.2中的Carbon API。

我找不到这被列为wxWidgets中的一个已知错误,我对提交犹豫不决,因为它似乎应该可行。列表框控件已深入集成到GUI中,我真的不想将它换成ListCtrl或类似的东西,因为我们现在正在使用所有其他功能。有没有人知道解决方法?

1 个答案:

答案 0 :(得分:1)

如果列表框正在滚动,则无法解决问题。滚动处理是基础碳库,滚动位置不能通过wx准确报告。

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

错误的根源是使用不正确的rowId参数调用Mac的底层DataBrowser。 wxWidgets正在传递行位置偏移,假设这将是rowId(并且可能在某些时候苹果在未指定真正的Id时在内部使用这些。)添加对另一个函数的调用将行的位置(偏移)转换为它的真实id。使用wxWidgets的修补版本,上述脚本按预期工作。