【问题标题】:Accessing API objc constants and enums from python从 python 访问 API objc 常量和枚举
【发布时间】:2010-11-05 13:40:10
【问题描述】:

我正在使用 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 常量?

【问题讨论】:

    标签: python objective-c enums constants pyobjc


    【解决方案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-07-09
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多