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.

È stato utile?

Soluzione

Ho dovuto farlo per farlo funzionare:

  1. 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.

  2. 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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top