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



在Mac OS X上,触控板支持多种手势,一种是用两个手指在页面上向上、向下、向左或向右滚动。wxPython有一个面板来帮助创建滚动窗口小部件wx.lib.scrolledpanel。但是它不支持手势,这真的很痛苦。

我已经尝试修改NSView,就像它是一个普通的Objective C应用程序一样,但是NSEvents使用的方法(touchesBeganWithEvent:等)被子类化,用作事件的通知和处理。这与wxPython中的Bind调用不同。然而,如果目标C允许猴子打补丁,那就好了。。。例如

def handleTouchBegin(event):
    print "Hey a touch event has begun!"
view.touchBeganWithEvent_ = handleTouchBegin

但是正如你所猜测的PyObj C的错误(因为Objective C不支持monkey补丁,或者不支持任何干净漂亮的方式),我得到了以下错误

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)?

ObjC不支持Python风格的猴痘匹配……但它确实支持一些类似的功能,如方法切换、类摆姿势、类别插入等。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

最新更新