以下代码示例适用于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或类似的东西,因为我们现在正在使用所有其他功能。有没有人知道解决方法?
答案 0 :(得分:1)
如果列表框正在滚动,则无法解决问题。滚动处理是基础碳库,滚动位置不能通过wx准确报告。
我在wxWidgets源代码中发现了这个错误,并在wxWidgets trac http://trac.wxwidgets.org/ticket/13699上打开了一张带有补丁的票证。
错误的根源是使用不正确的rowId参数调用Mac的底层DataBrowser。 wxWidgets正在传递行位置偏移,假设这将是rowId(并且可能在某些时候苹果在未指定真正的Id时在内部使用这些。)添加对另一个函数的调用将行的位置(偏移)转换为它的真实id。使用wxWidgets的修补版本,上述脚本按预期工作。