wx.ListBox.HitTest не работает на Mac - PullRequest
2 голосов
/ 22 ноября 2011

Следующий пример кода работает под 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), который использует Carbon API в 32-битном питоне 2.7.2.

Я не могу найти это в списке известных ошибок в wxWidgets, и я не решаюсь отправить его, так как, похоже, это должно работать.Элемент управления listbox глубоко интегрирован в наш графический интерфейс, и я действительно не хочу менять его на ListCtrl или что-то подобное, так как у нас сейчас работают все остальные функции.Кто-нибудь знает обходной путь?

1 Ответ

1 голос
/ 29 ноября 2011

Нет способа обойти, если список прокручивается. Прокрутка обрабатывается базовой библиотекой Carbon, и положение прокрутки точно не передается обратно через wx.

Я нашел ошибку в исходном коде wxWidgets и открыл тикет на трассе wxWidgets, http://trac.wxwidgets.org/ticket/13699, с патчем.

Корень ошибки - это вызов базового DataBrowser для Mac с неверным аргументом rowId. wxWidgets передавал смещения позиции строки, предполагая, что это будет rowId (и, возможно, в какой-то момент Apple использовала их внутренне, когда истинный Id не был указан). Добавление вызова к другой функции переводит позицию строки (смещение) в ее реальный идентификатор. С исправленной версией wxWidgets приведенный выше скрипт работает как положено.

...