PyObjC で HelloWorld - Xcode編


## 開発環境の準備

Xcodeをインストール後、http://qiita.com/tom-u/items/134e2b8d4e11feea8e12 の通りに環境を整える。

Xcodeのバージョンは 8.3.1 を使用しました。

## HelloWorld プロジェクトの作成

プロジェクトのテンプレートは `External Build System` を使用する。

![create.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/e9e7993a-05f5-9de8-7bdb-5fcc107ff654.jpeg "create.jpg")

![template.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/6a868271-8699-7dda-600a-aada34dba0e1.jpeg "template.jpg")

![option.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/5642da7f-5467-fd21-2e4b-4139c7eb517b.jpeg "option.jpg")

![save.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/12faf1ad-2f54-00b4-e259-2136c45e7190.jpeg "save.jpg")

![info.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/f0b9805b-cc6d-f53c-e750-c3fb2c3efb7a.jpeg "info.jpg")


## Makefile の作成

プロジェクトに`Makefile`を新規追加する。

![newfile.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/7e1b1dbe-0c7f-9edf-085e-5b09569ae3cf.jpeg "newfile.jpg")

![empty.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/11f391a1-9f67-576b-21c3-1022be098e78.jpeg "empty.jpg")

![makefile.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/90d45c25-362c-0b76-7ecb-b1641775fdfb.jpeg "makefile.jpg")

![createdmakefile.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/b166aff7-9086-d36b-b058-d4b6fce88143.jpeg "createdmakefile.jpg")

`Makefile`の内容は下記の通り。`Makefile`を書いたことがない人は **インデントにタブコードを使用** することに注意。

```Makefile
build:
	python setup.py py2app --alias

clean:
	rm -rf ./build/ ./dist/

install: clean
	python setup.py py2app

run:
	./dist/HelloWorld.app/Contents/MacOS/HelloWorld

launch:
	open ./dist/HelloWorld.app
```

## HelloWorld.py と setup.py の作成

`Makefile` 同様に `HelloWorld.py` と `setup.py` を作成する。

```python:HelloWorld.py
# -*- coding: utf-8 -*-
print('Hello Python')

from Foundation import NSLog
NSLog('Hello Python')

from AppKit import NSAlert
alert = NSAlert.alloc().init()
alert.setMessageText_('Hello Python')
alert.runModal()
```

```python:setup.py
"""
This is a setup.py script generated by py2applet

Usage:
    python setup.py py2app
"""

from setuptools import setup

APP = ['HelloWorld.py']
DATA_FILES = []
OPTIONS = {
    'packages': ['objc']
}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)
```

## make の build clean install 実行方法

ターミナルから通常の make コマンドで実行するのと同じく Xcode 上からも実行が可能。

### build - アプリ作成

![build.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/1987ebf5-48db-3457-9146-73583f928bca.jpeg "build.jpg")

### clean - アプリ削除

![clean.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/b52b5a83-a056-9045-b5fc-f115499492b6.jpeg "clean.jpg")

### install - 配布用にアプリを作成

![install.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/a01a7fec-7e50-4e21-3de3-45fc256d8172.jpeg "install.jpg")

## プロジェクトの実行

実行設定の為にあらかじめプロジェクトをビルドしてアプリを作成する。作成が完了したら以下の手順で実行の設定を行う。

![editscheme.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/c18881b0-a0f5-8223-7b96-ef902306a4e7.jpeg "editscheme.jpg")

![choosetorun.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/16317007-838a-d712-ddff-929dc141faea.jpeg "choosetorun.jpg")

![choseapp.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/affe2f2a-8b64-f338-264c-80cb6f0991a5.jpeg "choseapp.jpg")

![editedtorun.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/7019bca7-795d-a620-6bf2-7ea1fddf77af.jpeg "editedtorun.jpg")

設定後、 **Run** ボタンをクリックして実行する。

![run.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/f6a898b3-4235-5a25-1a2f-8f647bc0da51.jpeg "run.jpg")

## デバッグ例

コードに ```pdb``` のデバッグコードを記述すると可能。デバッグ実行は通常の実行と同じく **Run** ボタンのクリックで。Xcode 下部にメッセージが表示され pdb コマンドの入力待ちになるのでターミナル上と同様にキーボード操作でデバッグを行う。

```python:HelloWorld.py
# -*- coding: utf-8 -*-
print('Hello Python')

from Foundation import NSLog
NSLog('Hello Python')

# for debugging
import pdb; pdb.set_trace()

from AppKit import NSAlert
alert = NSAlert.alloc().init()
alert.setMessageText_('Hello Python')
alert.runModal()
```

![debugging.jpg](https://qiita-image-store.s3.amazonaws.com/0/91569/9c3e0d3f-08a4-32fe-6436-3e96abd069fd.jpeg "debugging.jpg")

中断操作は pdb操作の他に Run ボタン右隣りの Stop ボタンをクリックでも可能。