1

我正在使用 pyobjc 将一些需要的 OSX 功能添加到一些随机 python 软件中。我需要从 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 值硬编码为零。

如何通过 pyobjc 从 python 访问此类 objc 常量?

4

1 回答 1

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(将包含这些更改以及其他更改)并使用它。

于 2011-03-11T23:18:39.830 回答