Skip to main content
 首页 » 编程设计

python之wx.ListBox.HitTest 在 Mac 上不工作

2025年05月04日11leader

以下代码示例适用于 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 或类似的东西,因为我们现在可以使用所有其他功能。有人知道解决方法吗?

请您参考如下方法:

如果列表框正在滚动,则没有解决方法。滚动由底层 Carbon 库处理,滚动位置不会通过 wx 准确报告回来。

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

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