从python访问API objc常量和枚举

时间:2010-11-05 13:40:11

标签: python objective-c enums constants pyobjc

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

此类常量的一个示例位于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值硬编码为零,当它在原始库中随时可用时。

如何从python到pyobjc访问这些objc常量?

1 个答案:

答案 0 :(得分:1)

Apple提供的PyObjC早于10.6中对Cocoa的一些补充。 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(包含这些更改和其他更改)并使用它。

相关问题