2010-11-05 41 views
1

我正在使用pyobjc向某些随机Python软件添加一些所需的OSX功能。我需要从python-land访问API定义的objc-land常量。从python访问API objc常量和枚举

这样的常量的一个例子,在NSRunningApplication页面中,尤其是NSApplicationActivationPolicy的三个可能的值。

对于上下文,当前的任务是列出当前正在运行的,面向用户的应用程序。为此,下面的代码工作得很好:

from Foundation import * 
from Cocoa import * 
import objc 

for runningApp in sorted(
        NSWorkspace.sharedWorkspace().runningApplications(), 
        key=lambda x: x.localizedName() 
       ): 
    if runningApp.activationPolicy() == 0: 
     # Do stuff 

但我宁愿不核对零(以使其更易于阅读),也不在我自己的代码进行硬编码的虚拟NSApplicationActivationPolicyRegular值为零时,它随时可用在原始图书馆。

如何通过pyobjc从python访问这样的objc常量?

回答

1

苹果提供的PyObjC早于10.6中对可可的一些补充。 NSRunningApplication就是其中的一个,因此PyObjC不知道它。您需要在AppKit BridgeSupport文件中添加一些元数据:/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport

这三行代码将覆盖您正在尝试使用的enum

<enum name='NSApplicationActivationPolicyRegular' value='0' /> 
<enum name='NSApplicationActivationPolicyAccessory' value='1' /> 
<enum name='NSApplicationActivationPolicyProhibited' value='2' /> 

请注意,更改PyObjC像这可能意味着你必须静态链接,包括您的更新版本到您的应用程序分配,因为每个人的机器上的版本不会有这个数据。最好编译最新版本的PyObjC(它将包含这些变化加上其他)并使用它。