在Mac OS X上接受wxPython中的鼠标滚动手势

时间:2013-08-09 01:01:31

标签: python objective-c macos wxpython pyobjc

在Mac OS X上,触控板支持多种手势,一种是两次手指轻扫,可在页面上向上,向下,向左或向右滚动。 wxPython有一个面板来帮助创建滚动小部件wx.lib.scrolledpanel。然而,它不支持手势,这是一个真正的痛苦。

我试图修改NSView,因为它是普通的Objective C应用程序,但NSEvents使用子类的方法(touchesBeganWithEvent:等)作为通知和事件处理。这与wxPython中的Bind调用不同。如果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)?

1 个答案:

答案 0 :(得分:3)

ObjC不支持Python风格的monkeypatching ......但它确实支持一些类似的功能,如方法调配,类冒充,类别插入等.PyObjC可以做所有这些事情。

离开我的头顶,从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