在OSX Maverick上,我有这个基于PyObjC(python3.3)的简单APP
test.py
class MyDelegate(NSObject):
def applicationDidFinishLaunching_(self, sender):
NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, lambda event: NSLog("hello"))
NSApp.activateIgnoringOtherApps_(YES)
delegate = MyDelegate.alloc().init()
app = NSApplication.sharedApplication()
app.setDelegate_(delegate)
menu = NSMenu.alloc().initWithTitle_("My Menu")
app.setMainMenu_(menu)
window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_(
NSMakeRect(0, 0, 100, 100),
NSTitledWindowMask,
NSBackingStoreBuffered,
NO
)
window.setTitle_("my app")
window.makeKeyAndOrderFront_(None)
windowController = NSWindowController.alloc().initWithWindow_(window)
AppHelper.runEventLoop()
把它拉出来
python3 test.py
并在系统偏好设置中提供对终端的辅助功能访问 - >隐私与安全安全 - >辅助功能
我可以看到全局监视器工作。
然后我用cx_Freeze
冻结了它python3 setup.py bdist_mac
最终以
结束build/Test.app
带
open build/Test.app
我在OSX系统日志中看到错误
universalAccessAuthWarn[546]: AccessibilityAPI: pid 3809, is not allowed to access the accessibility API. Path: /path/to/build/Test.app/Contents/MacOS/test
我已启用“系统偏好设置”中的“测试”访问权限 - > “隐私与安全” - > “辅助功能”不起作用。
我在这里缺少什么?
更新: 可能是cx_Freeze的问题,使用py2app(0.8)使全局事件监视器工作。感谢Ronald Oussoren的提示(见下面的回答和评论)。
答案 0 :(得分:2)
我不知道为什么这不适用于cx_Freeze,使用此setup.py文件使用py2app对我有用:
from setuptools import setup
setup(
name='main',
app=['test.py'],
setup_requires=['py2app'],
)
也就是说,当我启动应用程序时,为其提供辅助功能访问权限,然后重新启动应用程序,我看到从Console.app中的应用程序进行日志记录。