Python CGEventTap总线错误

时间:2011-02-14 18:52:25

标签: python objective-c events macos pyobjc

每当我运行这个Python CGEventTap代码时,我都会收到一个总线错误:

def callback(ent):
    loc = CGEventGetLocation(ent)
    print loc

tap = CGEventTapCreate(
    kCGSessionEventTap,
    kCGHeadInsertEventTap, 
    kCGEventTapOptionDefault,
    CGEventMaskBit(kCGEventMouseMoved),
    callback(CGEventRef) )

loop = CFMachPortCreateRunLoopSource(None, tap, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), loop, kCFRunLoopCommonModes)

RunApplicationEventLoop()

有什么明显的东西我不见了吗?

1 个答案:

答案 0 :(得分:1)

  

我已经尝试了以下所有方法:......我需要哪些而不需要? 链接是什么意思? - 柚木

使用答案回复您的评论,因为它不适合评论。遗憾。

情况可能有点令人费解。 PyObjC有关于Apple框架中的函数,对象等的一大堆信息(元数据和一些帮助代码),但它不包含代码本身(因为它是Apple的代码和PyObjC)不能只是复制它)。您正在使用的功能在Apple的ApplicationServices框架中。 PyObjC在其Quartz模块中保留有关该框架的信息。所以第一部分是:要在Python中使用这些函数,你需要得到PyObjC的信息:from Quartz import *

第二部分是,就像我说的那样,你的应用程序需要知道,不仅仅是PyObjC的元数据在哪里,而是你尝试使用的Apple代码。这是链接部分。 (看起来你不是在使用Xcode,因为你正在设置自己的运行循环,但是在Xcode中,你会转到项目中的Linked Frameworks组并向其添加ApplicationServices。)

我猜你在使用py2app?我担心我不是百分百肯定如何这样做,但这个问题可能会让你开始:Problem using py2app

希望能为您指明方向。

(顺便说一下,当我用你的代码设置一个项目时,在Xcode和链接的ApplicationServices框架中,它锁定了我的输入设备,这样我唯一能做的就是重启。我可能已经做了一些事情错误,但要注意,当你得到这个链接时,可能是你设置的点击的其他问题。你可能想先尝试在C / Obj-C中这样做然后当你知道它可行时,转换成Python。)