Python的CGEventTap总线错误

问题描述:

我得到一个总线错误,每当我跑这条巨蟒CGEventTap代码: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() 

有没有办法,我失去了一些东西明显?

+0

你是否对ApplicationServices框架(即,不只是`输入`它)进行链接? – 2011-03-19 03:39:18

+1

@josh我已经尝试了以下所有内容:从基础导入*导入objc,从PyObjCTools导入AppHelper,从Quartz导入*导入AppKit导入*。我需要哪些而不需要?你的意思是_linking_? – Teak 2011-03-20 22:59:04

我尝试了以下所有内容:...我需要哪些而不需要?你是什​​么意思链接? - 柚木

回复您的评论与答复,因为它不适合在评论中。抱歉。

这种情况可能有点复杂。 PyObjC拥有一大堆关于Apple框架中的函数,对象等的信息(元数据和一些帮助代码),但它不包含代码本身(因为它是Apple的代码,PyObjC不能只是去围绕复制它)。您使用的功能在Apple的ApplicationServices框架中。 PyObjC在其Quartz模块中保存有关该框架的信息。因此第一部分是:要在Python中使用这些函数,您需要获取PyObjC的信息:from Quartz import *

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

我想你正在使用py2app?恐怕我不是100%确定如何做到这一点,但这个SO问题可能会让你开始:Problem using py2app

希望你指出一个有益的方向。 (顺便说一句,当我使用你的代码设置一个项目,在Xcode中,并且连接了ApplicationServices框架时,它锁定了我的输入设备,这样我唯一能做的就是重启。有什么不对,但要警告的是,当你连接这个链接的时候,可能是是你设置的tap的其他问题,你可能会先尝试在C/Obj-C中做这件事,然后再转换成Python你知道它的工作原理。)