2009-10-04 1 views
2

도크 아이콘 등으로 매우 기본적인 코코아 응용 프로그램을 만들고 싶다면 have to use Xcode 및 GUI 빌더 (w/PyObjC).기본 코코아 응용 프로그램은 파이썬에서 도킹을 사용하지만 Xcode와 그 모든 추가 기능이 없습니다

필자가 작성하려고하는 응용 프로그램은 알고리즘과 기본 IO에 주로 관련되어 있으므로 대부분 Apple 특정 항목과 관련이 없습니다.

기본적으로 응용 프로그램은 정기적으로 (예 : 3 분마다) 실행됩니다. AppleScript를 통해 일부 정보를 가져 와서 HTML 파일을 특정 디렉토리에 씁니다. 이 응용 프로그램의 Dock 아이콘을 추가하고 싶습니다. 주로 프로세스의 "상태"를 표시하고 싶습니다 (예를 들어, 오류가있는 경우 Dock 아이콘에 빨간색 플래그가 있음). 독 아이콘의 또 다른 이점은 시작할 때 실행할 수 있다는 것입니다.

간단한 방법으로 도크 오른쪽 클릭 메뉴를 정의하는 추가 보너스 (예 : 파이썬 호출 목록 사용).

Xcode 또는 GUI 빌더를 사용하지 않고 이멕스와 파이썬을 사용하여이 작업을 수행 할 수 있습니까?

+1

당신은 Cocoa 응용 프로그램을 사용하지만 실제로 Mac GUI 응용 프로그램을 의미합니까? 그렇다면 아직 py2app를 보았습니까? 이 도구를 사용하여 PyObjC를 비롯하여 Python에서 사용할 수있는 다양한 UI의 대부분을 갖춘 응용 프로그램을 만들 수 있으며 문서화 된 방법으로 사용자 정의 독 아이콘을 만들 수 있습니다. Dock 업데이트에 대해서는 잘 모릅니다. –

+1

얼굴없는 앱도 로그인시 실행할 수 있습니다. 계정 시스템 환경 설정 패널에서 로그인 항목 목록을 편집 할 수 있습니다. –

+0

@Ned - 예, Mac GUI 응용 프로그램 (독 아이콘과 배지 포함)을 의미합니다. 필자는 py2app를 더 자세히 살펴볼 것입니다. (다른 UI 툴킷이 Mac Dock과 상호 작용할 수있는 더 간단한 API를 제공하는지 확인합니다) –

답변

8

설치 최신 py2app 후 새 디렉토리를 만들어이 같은 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 초마다 임시 파일을 작성하는 것이 아니라) 지금까지 작성된 파일 수의 카운터를 보여주기보다는 자신의 상태 업데이트를 수행 할 것입니다), 등,하지만이 예제는 당신에게 가능한 출발점을 보여주기를 바랍니다.

그런 다음이 소스 파일이 포함 된 디렉토리로 이동하십시오. py2applet --make-setup HelloWorld.py, python setup.py py2app -A -p PyObjC.

이제 서브 디렉토리 distHelloWorld.app; open dist 아이콘을 Dock으로 드래그하면 모든 설정이 완료됩니다 (자신의 컴퓨터에서 -A 플래그로 인해 다른 컴퓨터로 배포하는 데 문제가있을 수 있지만 잘못 설치했을 이 컴퓨터를 둘러싼 파일 ;-). 의심 할 바없이 아이콘을 사용자 정의하고 싶을 것입니다 & c.

당신이 요청한 "여분의 신용"을하지 않습니다. 이미 많은 코드가 있습니다. 여기에서 멈추기로 결심했습니다 (여분의 신용은 새로운 질문을 보증 할 수 있습니다). 더구나, 나는 확실하지 않다 모두 내가 여기에서 수행하고있는 주문은 실제로 필요하거나 유용하다; docobs는 pyobjc를 만들기에 꽤 위장하고 있습니다.당신이 필요로하는 것처럼 Xcode를 사용하지 않고 애플 리케이션을 만들었습니다. 그래서 나는 그물과 간단한 시행 착오를 상당 부분 더한 예제 코드 조각들과 함께 해킹했습니다. 그래도 도움이되기를 바랍니다. -)

+0

감사합니다. 그것은 나를 위해 좋은 시작을 제공합니다. –

+0

schedule()에서 생성 된 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처럼 쉬운 모듈입니다. –

+0

@Sridhar : 링크 된 PyObjC 사이트를 보면 Xcode가 전혀 필요 없다는 것을 알 수 있습니다. – Chuck

+0

설명서에는 Xcode가 필요하다고 가정합니다. http://pyobjc.sourceforge.net/documentation/pyobjc-core/tutorial/index.html –

0

척은 PyObjC에 대해 정확합니다.

그런 다음이 NSApplication 메소드에 대해 읽은 다음 아이콘을 변경해야합니다. 도크 메뉴에 대한

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

는 응용 프로그램의 위임에 다음을 구현합니다. InterfaceBuilder 사용을 피하기 위해 프로그래밍 방식으로 NSMenu를 빌드 할 수 있습니다. 여기에 CD - -

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

관련 문제