如何使用Cocoa和Python(PyObjC)创建状态栏项目?
时间:2020-03-06 14:48:10 来源:igfitidea点击:
我已经在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中的所有其他代码都是默认的。
解决方案
我必须这样做才能使其正常工作:
- 打开MainMenu.xib。确保应用程序委托的类为" MyApplicationAppDelegate"。我不确定我们是否必须这样做,但是我做到了。这是错误的,因此应用程序委托从来没有被调用过。
- 添加
statusItem.retain()
,因为它会立即自动发布。
需要以上使用.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()