2009-10-04 3 views
2

Похоже, что если я хочу создать очень основное приложение Cocoa с иконкой док-станции и т. П., Я бы have to use Xcode и GUI-конструктор (w/PyObjC).Основное приложение для какао, использующее док-станцию ​​в Python, но не Xcode и все эти дополнительные функции

Приложение, которое я намереваюсь написать, в основном связано с алгоритмами и базовым IO - и, следовательно, не связано главным образом с конкретными вещами Apple.

В основном приложение должно запускаться периодически (скажем, каждые 3 минуты). Вытащить некоторую информацию через AppleScript и записать файлы HTML в конкретный каталог. Я хотел бы добавить значок док-станции для этого приложения .. в основном для отображения «статуса» процесса (например, если есть ошибка .. значок док-станции будет иметь красный флаг на нем). Еще одним преимуществом значка док-станции является то, что я могу запустить его при запуске.

Дополнительный бонус для определения правой кнопки мыши на док-станции простым способом (например: с использованием списков вызовов Python).

Могу ли я достичь этого без использования Xcode или GUI-сборщиков, но просто используя Emacs и Python?

+1

Вы говорите, что приложение Cocoa, но действительно ли вы имеете в виду приложение Mac GUI? Если да, посмотрели ли вы еще на py2app? Вы можете использовать его для создания приложения с большинством различных пользовательских интерфейсов, доступных на Python, включая PyObjC, и есть документированные способы создания пользовательского значка док-станции. Однако не знаю об обновлении док-станции. –

+1

Обратите внимание, что безликие приложения также могут запускаться при входе в систему: вы можете редактировать список элементов входа в панели настроек учетных записей. –

+0

@Ned - Да, я имею в виду приложение Mac GUI (с значком и значком док-станции). Я более подробно рассмотрю py2app. (также будет проверять, могут ли другие инструменты пользовательского интерфейса обеспечить более простой интерфейс для взаимодействия с док-станцией Mac) –

ответ

8

Установите последний 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, как вам нужно, поэтому я взломал это вместе с битами и кусками кода примера, найденными в сети, а также значительным количеством проб и ошибок. Тем не менее, я надеюсь, что это поможет! -)

+0

Спасибо; что дает хорошее начало для меня. –

+0

Вам нужно будет слить NSAutoreleasePool, созданный в расписании() в конце этой функции с помощью pool.drain(). – nall

+0

@nail, расписание никогда не заканчивается, потому что scheduler.run никогда не возвращается (поскольку каждый тик планирует другой), поэтому я подумал, что нет смысла что-то помещать после вызова scheduler.run - думаю, там должен быть комментарий, чтобы уточнить, что ...? –

2

PyObjC, который входит в комплект Mac OS X 10.5 и 10.6, довольно близок к тому, что вы ищете.

+0

Конечно, я знаю о PyObjC. В учебнике developer.apple.com/cocoa/pyobjc.html предлагается использовать Xcode и его GUI-конструктор. В то время как все, что я хочу, это модуль (такой же простой, как EasyDialogs), который можно использовать в Python без дополнительных инструментов. –

+0

@Sridhar: Если вы посмотрите на сайт PyObjC, с которым я связан, вы увидите, что он вообще не требует Xcode. – Chuck

+0

В документации предполагается, что нужен Xcode. http://pyobjc.sourceforge.net/documentation/pyobjc-core/tutorial/index.html –

0

Чак правильно относится к PyObjC.

Затем вы должны прочитать об этом методе NSApplication, чтобы изменить значок.

-(void)setApplicationIconImage:(NSImage *)anImage;

Для меню док-станции, осуществлять следующие действия в делегат приложения. Вы можете программировать NSMenu, чтобы избежать использования InterfaceBuilder.

-(NSMenu *)applicationDockMenu:(NSApplication *)sender;

 Смежные вопросы

  • Нет связанных вопросов^_^