HMDT 木下さんの Cocoaセミナー 初級編をPyObjCでやってみる。
パッケージで配布されているので、ダウンロードしてインストールしておきます。
ボタンを押すとボックスにテキストが表示されるアプリケーションを作ります。 「Cocoaセミナー初級編」のテキストに沿って作業を進めます。 通常のCocoa Applicationと異なる点は、
といったところです。
では作業開始。 まず、テキストでいうところの「4.1 新規プロジェクトの作成」で 「PyObjC Application」を選択して作業を進めます。 その後はテキスト通りにInterface BuilderでViewを作ります。
次に、テキストでいうところの「4.7 Controllerクラスの実装]では、 さきほどInterface Builderで作成した MainMenu.nib を元に Controllerクラス (Python) の雛形を生成してcontrollerを実装していきます。
$ python -c "import PyObjCScripts.nibclassbuilder" English.lproj/MainMenu.nib > HelloWorld.py
Pythonのファイル名は、buildされるApplication ディレクトリ(.app)名になるので、 適当な名前にしておきます。
HelloWorld.py
import objc
from Foundation import *
from AppKit import *
from PyObjCTools import NibClassBuilder, AppHelper
NibClassBuilder.extractClasses("MainMenu")
# class defined in MainMenu.nib
class Controller(NibClassBuilder.AutoBaseClass):
# the actual base class is NSObject
# The following outlets are added to the class:
# textField
def Say_(self, sender):
pass
# class defined in MainMenu.nib
class Hello_WorldAppDelegate(NibClassBuilder.AutoBaseClass):
# the actual base class is NSObject
pass
if __name__ == "__main__":
AppHelper.runEventLoop()
Interface Builderで作成した Controller クラスとそのアトリビュート textField (Outlets) , Say_ (Actions) が組み込まれています。 Controller.Say_ を実装します。
HelloWorld.py
class Controller(NibClassBuilder.AutoBaseClass):
...
def Say_(self, sender):
self.textField.setStringValue_(u"Hello World!")
「4.8 ビルドと実行」 さてbuildの準備です。 defaultの setup を書き換えます。 app にControllerを記述したPythonファイル名を、 DateTimeField にnibディレクトリ名をセットします。
setup.py
setup(
app=['HelloWorld.py'],
data_files=['English.lproj/MainMenu.nib'],
)
buildします。
$ python setup.py py2app -A
running py2app
creating /Hello World/build
creating /Hello World/build/bdist.macosx-10.3-fat
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app/collect
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app/temp
creating /Hello World/dist
creating build/bdist.macosx-10.3-fat/python2.4-standalone/app/lib-dynload
creating build/bdist.macosx-10.3-fat/python2.4-standalone/app/Frameworks
*** creating application bundle: HelloWorld ***
$ open dist/HelloWorld.app
dist ディレクトリの下に app ができているので起動してみます。 これで Objective-C で実装した場合と同じ動作になると思います。
Interface Builderで定義した class は English.lproj/MainMenu.nib/classes.nib に書いてあります。
English.lproj/MainMenu.nib/classes.nib
{
IBClasses = (
{
ACTIONS = {Say = id; };
CLASS = Controller;
LANGUAGE = ObjC;
OUTLETS = {textField = id; };
SUPERCLASS = NSObject;
},
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = "Hello_WorldAppDelegate"; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
);
IBVersion = 1;
}
PyObjCTools.NibClassBuilder は PyObjCTools.NibInfo のsubclassです。
NibClassBuilder.extractClasses("MainMenu") で MainMenu.nib/classes.nib を解析して NibClassBuilder.classes をセットしています。
textField の型を見てみます。
HelloWorld.py
class Controller(NibClassBuilder.AutoBaseClass):
...
def Say_(self, sender):
self.textField.setStringValue_(type(self.textField))
NSTextField と表示されます。
Xcode の Developer Documentation で検索してみると NSTextField Class Reference がヒットします。 Companion guide のリンクを辿ると Text Fields についてのドキュメントが見れます。
さらに Text Fields の Inherits from から NSControl のリンクを辿り NSControl Class Reference を参照すると Setting the control’s value に setStringValue: がリストされています
PyObjC における setStringValue_ は、Objectiv-Cの setStringValue: に対応するようです。
他にも、
がリストされています。
