python cocoa pyobjc

¿Cómo puedo crear un elemento de la barra de estado con Cocoa y Python(PyObjC)?



(2)

Tenía que hacer esto para que funcione:

  1. Abra 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. Agrega statusItem.retain() porque se libera automáticamente de inmediato.

He creado un nuevo proyecto en XCode y tengo lo siguiente en mi archivo AppDelegate.py:

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, no aparece ningún elemento de la barra de estado. El resto del código en main.py main.m es el predeterminado.


El uso anterior de .retain () es obligatorio porque el statusItem se destruye al volver del método applicationDidFinishLaunching (). Enlace esa variable como un campo en instancias de MyApplicationAppDelegate usando self.statusItem en su lugar.

Aquí hay 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()