2008-09-26 8 views
8

J'ai créé un tout nouveau projet dans XCode et ont les éléments suivants dans mon fichier AppDelegate.py:Comment créer un élément de barre d'état avec Cocoa et Python (PyObjC)?

from Foundation import * 
from AppKit import * 

class MyApplicationAppDelegate(NSObject): 
    def applicationDidFinishLaunching_(self, sender): 
     NSLog("Application did finish launching.") 

     statusItem = NSStatusBar.systemStatusBar().statusItemWithLength_(NSVariableStatusItemLength) 
     statusItem.setTitle_(u"12%") 
     statusItem.setHighlightMode_(TRUE) 
     statusItem.setEnabled_(TRUE) 

Cependant, quand je lance l'application aucun élément de barre d'état apparaît. Tous les autres codes dans main.py et main.m sont par défaut.

Répondre

5

je devais faire cela pour le faire fonctionner:

  1. Ouvrir MainMenu.xib. Assurez-vous que la classe du délégué de l'application est MyApplicationAppDelegate. Je ne suis pas sûr si vous devrez faire ceci, mais je l'ai fait. C'était faux et donc le délégué de l'application n'a jamais été appelé en premier lieu.

  2. Ajoutez statusItem.retain() car il est automatiquement libéré automatiquement.

+1

Il était le statusItem.retain() qui l'a fait. Merci! – DavidM

+0

Intéressant, car la documentation de PyObjC dit qu'il n'est pas nécessaire de faire du tout une gestion manuelle de la mémoire. Quand relâchez-vous statusItem? –

4

L'utilisation ci-dessus pour .retain() est nécessaire parce que le statusItem est détruite lors du retour de la méthode applicationDidFinishLaunching(). Liez cette variable en tant que champ dans les instances de MyApplicationAppDelegate à l'aide de self.statusItem.

Voici un exemple modifié qui ne nécessite pas un .xib/etc ...

from Foundation import * 
from AppKit import * 
from PyObjCTools import AppHelper 

start_time = NSDate.date() 


class MyApplicationAppDelegate(NSObject): 

    state = 'idle' 

    def applicationDidFinishLaunching_(self, sender): 
     NSLog("Application did finish launching.") 

     self.statusItem = NSStatusBar.systemStatusBar().statusItemWithLength_(NSVariableStatusItemLength) 
     self.statusItem.setTitle_(u"Hello World") 
     self.statusItem.setHighlightMode_(TRUE) 
     self.statusItem.setEnabled_(TRUE) 

     # Get the timer going 
     self.timer = NSTimer.alloc().initWithFireDate_interval_target_selector_userInfo_repeats_(start_time, 5.0, self, 'tick:', None, True) 
     NSRunLoop.currentRunLoop().addTimer_forMode_(self.timer, NSDefaultRunLoopMode) 
     self.timer.fire() 

    def sync_(self, notification): 
     print "sync" 

    def tick_(self, notification): 
     print self.state 


if __name__ == "__main__": 
    app = NSApplication.sharedApplication() 
    delegate = MyApplicationAppDelegate.alloc().init() 
    app.setDelegate_(delegate) 
    AppHelper.runEventLoop()