wx.ListBox.HitTest在Mac上失效

2 投票
1 回答
513 浏览
提问于 2025-04-17 06:47

以下的代码示例在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的已知错误列表中找到这个问题,我也不太想提交这个问题,因为我觉得它应该是可以工作的。我们的列表框控件与图形界面紧密集成,我真的不想换成ListCtrl或其他类似的东西,因为我们现在的所有其他功能都正常运行。有没有人知道有什么解决办法?

1 个回答

1

如果列表框正在滚动,就没有其他解决办法。滚动是由底层的Carbon库处理的,而通过wx返回的滚动位置并不准确。

我在wxWidgets的源代码中发现了这个bug,并在wxWidgets的跟踪系统上提交了一个问题,http://trac.wxwidgets.org/ticket/13699,并附上了修复方案。

这个bug的根本原因是调用了Mac底层的DataBrowser时,传入了错误的行ID。wxWidgets传递的是行的位置偏移,假设这就是行ID(也许在某个时候,苹果在没有指定真实ID时内部使用了这些偏移)。通过添加一个调用另一个函数的步骤,可以将行的位置(偏移)转换为它的真实ID。使用修复过的wxWidgets版本,上面的脚本就能正常工作了。

撰写回答