Как я могу создать элемент строки состояния с Какао и Python (PyObjC)? - PullRequest
8 голосов
/ 26 сентября 2008

Я создал новый проект в XCode, и в моем файле 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)

Однако, когда я запускаю приложение, элемент строки состояния не отображается. Весь другой код в main.py и main.m используется по умолчанию.

Ответы [ 2 ]

5 голосов
/ 07 декабря 2010

Вышеупомянутое использование .retain () требуется, потому что statusItem уничтожается по возвращении из метода applicationDidFinishLaunching (). Свяжите эту переменную как поле в экземплярах MyApplicationAppDelegate, используя вместо этого self.statusItem.

Вот модифицированный пример, для которого не требуется .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()
5 голосов
/ 27 сентября 2008

Я должен был сделать это, чтобы это заработало:

  1. Откройте MainMenu.xib. Убедитесь, что класс делегата приложения равен MyApplicationAppDelegate. Я не уверен, что вам придется делать это, но я сделал. Это было неправильно, и поэтому делегату приложения никогда не звонили.

  2. Добавьте statusItem.retain(), потому что он автоматически освобождается сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...