2008-09-26 18 views
8

He creado un nuevo proyecto en Xcode y tienen el siguiente en mi archivo AppDelegate.py:¿Cómo puedo crear un elemento de la barra de estado con Cocoa y 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) 

Sin embargo, cuando inicio la aplicación sin elemento de la barra de estado muestra arriba. El resto del código en main.py main.m es el predeterminado.

Respuesta

5

que tenía que hacer esto para que funcione:

  1. abierto MainMenu.xib. Asegúrese de que la clase del delegado de la aplicación sea MyApplicationAppDelegate. No estoy seguro de si tendrá que hacer esto, pero lo hice. Fue un error y, por lo tanto, el delegado de la aplicación nunca fue llamado en primer lugar.

  2. Agregue statusItem.retain() porque se libera automáticamente de inmediato.

+1

Fue el statusItem.retain() que lo hizo. ¡Gracias! – DavidM

+0

Interesante, porque la documentación de PyObjC dice que uno no necesita hacer ninguna gestión de memoria manual. ¿Cuándo liberas statusItem? –

4

El uso por encima de .retain() es necesario porque el statusItem está siendo destruido a su regreso desde el método applicationDidFinishLaunching(). Enlace esa variable como un campo en instancias de MyApplicationAppDelegate utilizando self.statusItem en su lugar.

Aquí es un ejemplo modificado que no requiere 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() 
Cuestiones relacionadas