wx.ListBox.HitTest在Mac上失效
以下的代码示例在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版本,上面的脚本就能正常工作了。