كيف يمكنني إنشاء عنصر شريط الحالة باستخدام 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 / إلخ...

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