代码之家  ›  专栏  ›  技术社区  ›  davidmytton

如何使用Cocoa和Python(PyObjC)创建状态栏项?

  •  9
  • davidmytton  · 技术社区  · 17 年前

    我在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 回复  |  直到 17 年前
        1
  •  6
  •   brandon    15 年前

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

    这是一个不需要.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()
    
        2
  •  5
  •   Chris Lundie    17 年前

    我必须这样做才能让它工作:

    1. 打开主菜单.xib。确保应用程序代理的类为 MyApplicationAppDelegate 我不确定你是否必须这样做,但我做了。这是错误的,所以应用程序代表从一开始就没有接到电话。

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