Как я могу создать элемент строки состояния с помощью Cocoa и Python (PyObjC)?
Вопрос
Я создал новый проект в 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() требуется, поскольку 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()