2008-09-26 5 views
8

Ich habe ein neues Projekt in XCode erstellt und haben folgende in meiner AppDelegate.py Datei:Wie kann ich ein Statusleistenelement mit Cocoa und Python (PyObjC) erstellen?

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) 

Allerdings, wenn ich die Anwendung kein Statusleiste Element starten erscheint. Der gesamte Code in main.py und main.m ist der Standard.

Antwort

5

Ich hatte dies zu tun, damit es funktioniert:

  1. öffnen MainMenu.xib. Stellen Sie sicher, dass die Klasse des Anwendungsdelegaten MyApplicationAppDelegate lautet. Ich bin mir nicht sicher, ob Sie das tun müssen, aber ich tat es. Es war falsch und so wurde der App-Delegierte nie angerufen.

  2. Fügen Sie statusItem.retain() hinzu, da es sofort automatisch freigegeben wird.

+1

Es war die statusItem.retain(), die es tat. Vielen Dank! – DavidM

+0

Interessant, weil die PyObjC-Dokumentation besagt, dass man keine manuelle Speicherverwaltung durchführen muss. Wann geben Sie statusItem frei? –

4

Die obige Verwendung von .retain() erforderlich ist, weil die von der statusItem applicationDidFinishLaunching() Methode bei Rückkehr zerstört wird. Binden Sie diese Variable als ein Feld in Instanzen von MyApplicationAppDelegate, indem Sie stattdessen self.statusItem verwenden. Hier

ist ein modifiziertes Beispiel, das kein .xib/etc erfordert ...

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() 
Verwandte Themen