Установите последний py2app, а затем сделать новый каталог - CD к нему - в нем сделать HelloWorld.py
файл, например:
# generic Python imports
import datetime
import os
import sched
import sys
import tempfile
import threading
import time
# need PyObjC on sys.path...:
for d in sys.path:
if 'Extras' in d:
sys.path.append(d + '/PyObjC')
break
# objc-related imports
import objc
from Foundation import *
from AppKit import *
from PyObjCTools import AppHelper
# all stuff related to the repeating-action
thesched = sched.scheduler(time.time, time.sleep)
def tick(n, writer):
writer(n)
thesched.enter(20.0, 10, tick, (n+1, writer))
fd, name = tempfile.mkstemp('.txt', 'hello', '/tmp');
print 'writing %r' % name
f = os.fdopen(fd, 'w')
f.write(datetime.datetime.now().isoformat())
f.write('\n')
f.close()
def schedule(writer):
pool = NSAutoreleasePool.alloc().init()
thesched.enter(0.0, 10, tick, (1, writer))
thesched.run()
# normally you'd want pool.drain() here, but since this function never
# ends until end of program (thesched.run never returns since each tick
# schedules a new one) that pool.drain would never execute here;-).
# objc-related stuff
class TheDelegate(NSObject):
statusbar = None
state = 'idle'
def applicationDidFinishLaunching_(self, notification):
statusbar = NSStatusBar.systemStatusBar()
self.statusitem = statusbar.statusItemWithLength_(
NSVariableStatusItemLength)
self.statusitem.setHighlightMode_(1)
self.statusitem.setToolTip_('Example')
self.statusitem.setTitle_('Example')
self.menu = NSMenu.alloc().init()
menuitem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(
'Quit', 'terminate:', '')
self.menu.addItem_(menuitem)
self.statusitem.setMenu_(self.menu)
def writer(self, s):
self.badge.setBadgeLabel_(str(s))
if __name__ == "__main__":
# prepare and set our delegate
app = NSApplication.sharedApplication()
delegate = TheDelegate.alloc().init()
app.setDelegate_(delegate)
delegate.badge = app.dockTile()
delegate.writer(0)
# on a separate thread, run the scheduler
t = threading.Thread(target=schedule, args=(delegate.writer,))
t.setDaemon(1)
t.start()
# let her rip!-)
AppHelper.runEventLoop()
Конечно, в вашем реальном коде, вы будете выполнять свои собственные периодические действия каждые 3 минуты (вместо того, чтобы писать временный файл каждые 20 секунд, как я здесь делаю), делая ваши собственные обновления статуса (а не просто показывая счетчик количества файлов, написанных до сих пор) и т. д. и т. д., но я надеюсь, что этот пример показывает вам жизнеспособную отправную точку.
Затем в Terminal.App cd в каталог, содержащий этот исходный файл, py2applet --make-setup HelloWorld.py
, python setup.py py2app -A -p PyObjC
.
У вас теперь есть в подкаталоге dist
справочник HelloWorld.app
; open dist
и перетащите значок на док-станцию, и все вы настроены (на вашей собственной машине - распространение на другие машины может не работать из-за флага -A
, но мне не удалось построить без него, возможно, из-за неправильно установленного яйца файлы, лежащие вокруг этой машины ;-). Без сомнения, вы захотите настроить свой значок & c.
Это не делает «лишний кредит», о котором вы просили, - это уже много кода, и я решил остановиться здесь (дополнительный кредит может потребовать новый вопрос). Кроме того, я не совсем уверен, что все заклинания, которые я здесь исполняю, действительно необходимы или полезны; документы являются довольно латитантными для создания pyobjc.приложение без Xcode, как вам нужно, поэтому я взломал это вместе с битами и кусками кода примера, найденными в сети, а также значительным количеством проб и ошибок. Тем не менее, я надеюсь, что это поможет! -)
Вы говорите, что приложение Cocoa, но действительно ли вы имеете в виду приложение Mac GUI? Если да, посмотрели ли вы еще на py2app? Вы можете использовать его для создания приложения с большинством различных пользовательских интерфейсов, доступных на Python, включая PyObjC, и есть документированные способы создания пользовательского значка док-станции. Однако не знаю об обновлении док-станции. –
Обратите внимание, что безликие приложения также могут запускаться при входе в систему: вы можете редактировать список элементов входа в панели настроек учетных записей. –
@Ned - Да, я имею в виду приложение Mac GUI (с значком и значком док-станции). Я более подробно рассмотрю py2app. (также будет проверять, могут ли другие инструменты пользовательского интерфейса обеспечить более простой интерфейс для взаимодействия с док-станцией Mac) –