当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用Cocoa和Python(PyObjC)创建状态栏项?》经验,为你挑选了2个好方法。

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



1> Chris Lundie..:

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

    打开MainMenu.xib.确保应用程序委托的类是MyApplicationAppDelegate.我不确定你是否必须这样做,但我做到了.这是错误的,所以应用代表从来没有被调用过.

    添加statusItem.retain()因为它立即自动释放.



2> 小智..:

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

这是一个不需要.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()

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有