Come posso creare un elemento della barra di stato con Cocoa e Python (PyObjC)?
Domanda
Ho creato un nuovo progetto in XCode e ho il seguente nel mio file 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)
Tuttavia, all'avvio dell'applicazione non viene visualizzato alcun elemento della barra di stato. Tutti gli altri codici in main.py e main.m sono predefiniti.
Soluzione
Ho dovuto farlo per farlo funzionare:
-
Apri MainMenu.xib. Assicurati che la classe del delegato dell'app sia
MyApplicationAppDelegate
. Non sono sicuro che dovrai farlo, ma l'ho fatto. Era sbagliato e quindi il delegato dell'app non è mai stato chiamato in primo luogo. -
Aggiungi
statusItem.retain ()
perché viene immediatamente rilasciato automaticamente.
Altri suggerimenti
L'uso di .retain () sopra indicato è necessario perché statusItem viene distrutto al ritorno dal metodo applicationDidFinishLaunching (). Associa quella variabile come campo nelle istanze di MyApplicationAppDelegate utilizzando invece self.statusItem.
Ecco un esempio modificato che non richiede un file .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()