Как я могу создать элемент строки состояния с помощью Cocoa и Python (PyObjC)?

StackOverflow https://stackoverflow.com/questions/141432

  •  02-07-2019
  •  | 
  •  

Вопрос

Я создал новый проект в 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. Откройте MainMenu.xib.Убедитесь, что класс делегата приложения равен MyApplicationAppDelegate.Я не уверен, что вам придется это делать, но я сделал.Это было неправильно, и поэтому делегат приложения вообще не вызывался.

  2. Добавить 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top