2010-11-05 1 views
1

Я использую pyobjc для добавления некоторых необходимых функциональных возможностей OSX к некоторому случайному программному обеспечению python. Мне нужно будет получить доступ к API-константам objc-land из python-land.Доступ к константам objc API и перечислениям из python

Пример таких констант лежит далеко внизу на странице 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 до нуля в моем собственном коде, когда он легко доступен в оригинальной библиотеке.

Как я могу получить доступ к таким константам objc из python через pyobjc?

ответ

1

В комплект поставки PyObjC, поставляемый компанией Apple, входят некоторые дополнения, которые были сделаны в Cocoa в 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 (которая будет содержать эти изменения плюс другие) и использовать ее.

 Смежные вопросы

  • Нет связанных вопросов^_^