9

我在 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 中的所有其他代码都是默认的。

4

2 回答 2

6

上面的 .retain() 用法是必需的,因为 statusItem 在从 applicationDidFinishLaunching() 方法返回时被销毁。使用 self.statusItem 将该变量绑定为 MyApplicationAppDelegate 实例中的字段。

这是一个不需要 .xib / 等的修改示例...

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()
于 2010-12-07T17:27:19.400 回答
5

我必须这样做才能使其工作:

  1. 打开 MainMenu.xib。确保应用程序委托的类是MyApplicationAppDelegate. 我不确定你是否必须这样做,但我做到了。这是错误的,所以应用程序委托一开始就没有被调用。

  2. 添加statusItem.retain()是因为它会立即自动发布。

于 2008-09-26T21:41:54.733 回答