2013-08-09 2 views
1

В Mac OS X трекпад поддерживает несколько жестов, один из двух пальцев позволяет прокручивать вверх, вниз, влево или вправо на странице. wxPython имеет панель, которая поможет создавать прокрученные виджеты wx.lib.scrolledpanel. Однако у него нет поддержки жестов, которые являются настоящей болью.Принимая жесты прокрутки мыши в wxPython на Mac OS X

Я попытался изменить NSView, как это было сделано, если это было обычное приложение Objective C, однако NSEvents использует методы (touchhesBeganWithEvent: и т. Д.), Которые подклассифицированы для использования в качестве уведомления и обработки события , Это не похоже на вызовы Bind в wxPython. Это было бы хорошо, однако если Objective C разрешено обезьяний заплаток ... например

def handleTouchBegin(event): 
    print "Hey a touch event has begun!" 

view.touchBeganWithEvent_ = handleTouchBegin 

, но как вы можете догадаться ошибками PyObj C (так как Objective C не поддерживает обезьяну заплаток или нет в любой чистой и красивой моде) и Я получаю следующую ошибку

TypeError: cannot change a method 

хорошо хорошо я мог делать то, что яблоко говорит и подкласс, но объект уже создан, так как я все еще могу захватить события. Конечно, есть также

NSEvent addGlobalMonitorForEventsMatchingMask: 
and 
NSEvent addLocalMonitorForEventsMatchingMask: 

но те же разочаровать в том, что они либо не поступят с приложением (глобальные сделок со всеми остальными) или не имеет дела с событиями одной NSView (или делает это и я дезинформирован).

Итак, как мне это сделать? Я пропустил еще один вариант, я знаю, что кое-что прочитал о NSResponder, но из того, что я собрал, это NSView, ответчик событий и вы не добавляете его в NSView.

Есть ли наблюдатели, как в QTKit, такие как для контроля изменения состояния нагрузки (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/QTKitApplicationProgrammingGuide/AnatomyoftheQTKFramework/AnatomyoftheQTKFramework.html#//apple_ref/doc/uid/TP40008156-CH109-SW11)?

+0

Вы существующий вид, созданный кем-то другим, и вы хотите изменить его обработки событий? –

+0

Да. Ну, я хочу захватить сенсорные события на дорожке. – Zimm3r

ответ

3

ObjC не поддерживает Python-стиль monkeypatching ... но он поддерживает некоторые аналогичные функции, такие как метод swizzling, класс posing, interposition категории и т. Д. И PyObjC может выполнять все эти вещи.

Off верхней части моей головы, swizzling от PyObjC должен выглядеть примерно так:

def swizzle(cls, sel, func): 
    oldimp = cls.instanceMethodForSelector_(sel) 
    def wrapper(self, *args, **kwargs): 
     return func(self, oldimp, *args, **kwargs) 
    newmethod = objc.selector(wrapper, 
           selector=oldimp.selector, signature=oldimp.signature) 
    objc.classAddMethod(cls, sel, newmethod) 
    return wrapper 
+0

Так ли swizzling заменить метод или обернуть его (например, вызвать его до или после вызова функции)? – Zimm3r

+0

@ Zimm3r: он заменяет метод. Но если вы действительно не знаете о методе ObjC swizzling ... ну, я думаю, начинаем [здесь] (http://cocoadev.com/MethodSwizzling) и ищем примеры оттуда, потому что есть много мелких деталей, которые удивят вы, если вы являетесь разработчиком Python, чем разработчик ObjC ... – abarnert

+0

Хорошо спасибо за ссылку. – Zimm3r

 Смежные вопросы

  • Нет связанных вопросов^_^