2010-11-05 7 views
1

J'utilise pyobjc pour ajouter certaines fonctionnalités OSX nécessaires à certains logiciels python aléatoires. J'aurai besoin d'accéder aux constantes objc-land définies par l'API à partir de python-land.Accéder aux constantes d'API et aux enums de python

Un exemple de telles constantes se trouve très loin dans la page NSRunningApplication, en particulier les trois valeurs possibles de NSApplicationActivationPolicy. Pour le contexte, la tâche actuelle consiste à répertorier les applications en cours d'exécution qui sont tournées vers l'utilisateur. A cet effet, le code suivant fonctionne très bien:

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 

Mais je préfère ne pas vérifier contre zéro (pour le rendre plus lisible) ni coder en dur une valeur NSApplicationActivationPolicyRegular factice à zéro dans mon propre code quand il est facilement disponible dans la bibliothèque originale.

Comment puis-je accéder à ces constantes objc de python à pyobjc?

Répondre

1

Le PyObjC fourni par Apple est antérieur à certains des ajouts apportés à Cocoa dans 10.6. NSRunningApplication est l'un de ces ajouts, et donc PyObjC ne le sait pas. Vous devez ajouter des métadonnées dans le fichier AppKit BridgeSupport à: /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport

Ces trois lignes couvriront le enum que vous essayez d'utiliser.

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

Notez que la modification PyObjC comme cela signifie probablement que vous devrez lier statiquement et inclure votre version mise à jour dans votre application pour la distribution, parce que la version sur la machine de tout le monde aura pas ces données. Il pourrait être préférable de compiler la nouvelle version de PyObjC (qui contiendra ces changements plus d'autres) et l'utiliser.