2011-02-14 69 views
0

我得到一個總線錯誤,每當我跑這條巨蟒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

回答

1

我嘗試了以下所有內容:...我需要哪些而不需要?你是什​​麼意思鏈接? - 柚木

回覆您的評論與答覆,因爲它不適合在評論中。抱歉。

這種情況可能有點複雜。 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你知道它的工作原理。)